Как создать Listview с двумя текстовыми представлениями и одной кнопкой переключения?

Я создал список с двумя текстовыми представлениями в качестве имени и номера телефона. и перед этой кнопкой переключения. я должен получить имя, когда я нажимаю на кнопку переключения. но выдает ошибку как

'02-17 06:49:53.170: E/AndroidRuntime(1425): java.lang.ClassCastException: android.widget.TextView нельзя преобразовать в android.widget.ToggleButton 02-17 06:49:53.170: E/AndroidRuntime( 1425): в com.example.comparearray.MainActivity$1.onItemClick(MainActivity.java:85) 02-17 06:49:53.170: E/AndroidRuntime(1425): в android.widget.AdapterView.performItemClick(AdapterView.java: 299) 02-17 06:49:53.170: E/AndroidRuntime(1425): в android.widget.AbsListView.performItemClick(AbsListView.java:1113) 02-17 06:49:53.170: E/AndroidRuntime(1425): в android.widget.AbsListView$PerformClick.run(AbsListView.java:2904) 02-17 06:49:53.170: E/AndroidRuntime(1425): в android.widget.AbsListView$3.run(AbsListView.java:3638) 02- 17 06:49:53.170: E/AndroidRuntime(1425): на android.os.Handler.handleCallback(Handler.java:733) 02-17 06:49:53.170: E/AndroidRuntime(1425): на android.os. Handler.dispatchMessage(Handler.java:95) 02-17 06:49:53.170: E/AndroidRuntime(1425) : в android.os.Looper.loop(Looper.java:136) 02-17 06:49:53.170: E/AndroidRuntime(1425): в android.app.ActivityThread.main(ActivityThread.java:5017) 02-17 06:49:53.170: E/AndroidRuntime(1425): в java.lang.reflect.Method.invokeNative(собственный метод) 02-17 06:49:53.170: E/AndroidRuntime(1425): в java.lang.reflect. Method.invoke(Method.java:515) 02-17 06:49:53.170: E/AndroidRuntime(1425): в com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) 02-17 06:49:53.170: E/AndroidRuntime(1425): в com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) 02-17 06:49:53.170: E/AndroidRuntime(1425): в dalvik .system.NativeStart.main (собственный метод)

ниже мой код

 lvCountries = (ListView) findViewById(R.id.lv_countries);

OnItemClickListener itemClickListener = new OnItemClickListener() {
 @Override

public void onItemClick(AdapterView<?> lv, View item, int position, long id) {

     ListView lView = (ListView) lv;

     SimpleAdapter adapter = (SimpleAdapter) lView.getAdapter();

     HashMap<String,Object> hm = (HashMap) adapter.getItem(position);

     /** The clicked Item in the ListView */
     RelativeLayout rLayout = (RelativeLayout) item;

     /** Getting the toggle button corresponding to the clicked item */
    ToggleButton tgl = (ToggleButton) rLayout.getChildAt(1);


     String strStatus = "";
     if(tgl.isChecked()){
         tgl.setChecked(false);
         strStatus = "Off";
         status[position]=false;
     }else{
         tgl.setChecked(true);
         strStatus = "On";
         status[position]=true;
     }
     Toast.makeText(getBaseContext(), (String) hm.get("txt") + " : " + strStatus, Toast.LENGTH_SHORT).show();
 }

};

lvCountries.setOnItemClickListener (itemClickListener);

пожалуйста, помогите мне, я застрял здесь.


person Simran    schedule 18.02.2015    source источник
comment
Вы уверены, что rLayout.getChildAt(1); даст вам ToogleButton? Вероятно, это rLayout.getChildAt(2);...   -  person miselking    schedule 18.02.2015


Ответы (5)


Изменить следующую строку

ToggleButton tgl = (ToggleButton) rLayout.getChildAt(1);

to

ToggleButton tgl = (ToggleButton) rLayout.getChildAt(2);

Примечание. Если не работает один раз, очистите проект и повторите попытку.

Надеюсь, это поможет вам.

person Nagaraju V    schedule 18.02.2015
comment
Спасибо всем, мой переключатель находится в положении 0. - person Simran; 18.02.2015

в нем четко указано, что вы пытаетесь преобразовать текст в кнопку переключения, поэтому сначала проверьте положение переключателя в вашем макете. Здесь есть текстовое представление по индексу 1 rLayout.getChildAt(1); .

person KDeogharkar    schedule 18.02.2015

Вместо использования статического индекса для получения ToggleButton из выбранного макета строки используйте instanceof, чтобы проверить, является ли представление ToggleButton или TextView:

RelativeLayout rLayout = (RelativeLayout) arg1;
for (int index = 0; index < rLayout.getChildCount(); index++) {
     View view=rLayout.getChildAt(index);
     if(view instanceof ToggleButton){      
        ToggleButton tgl = (ToggleButton)view;       
         //... do task here...
        break;
     }
}
person ρяσѕρєя K    schedule 18.02.2015

Ошибка говорит: «TextView не может быть приведен к android.widget.ToggleButton», поэтому метод «rLayout.getChildAt (1)» явно не работает для вас. вы можете установить идентификатор в XML, а затем найти его в своем «rLayout».

person yshahak    schedule 18.02.2015
comment
Как я могу найти идентификатор из rLayout? - person Simran; 18.02.2015
comment
rLayout.findViewById(R.id.your_id) - person yshahak; 18.02.2015

Вы переводите TextView в ToggleButton. Проблема именно в этой строке:

ToggleButton tgl = (ToggleButton) rLayout.getChildAt(1);

По какой-то причине дочерний элемент 1 является TextView, а не ожидаемым ToggleButton.

Я рекомендую вам использовать findViewById вместо getChildAt, чтобы вы могли найти их по идентификатору, а не по позиции в макете. Это позволит избежать подобных ошибок, связанных с порядком виджетов.

person Juanjo Vega    schedule 18.02.2015