Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Casilla de verificación en ExpandableListView

Estoy utilizando un ExpandableListView en el que cada grupo es un TextView y cada niño es un CheckBox . Estaba tratando de implementar algo similar a este enlace:

Http://www.vogella.de/articles/AndroidListView/article.html#listadvanced_interactive

Pero con un ExpandableListView lugar de ListView . En tiempo de ejecución, está dando una extraña ClassCastException al establecer la Tag para la casilla mediante setTag() . Aquí está el código:

 public class ExpandableActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); ArrayList<String> groups = new ArrayList<String>(); List<List<OptionItem>> children = new ArrayList<List<OptionItem>>(); for (int i = 0; i < 10; i++) { String groupName = "Group " + i; groups.add(groupName); List<OptionItem> temp = new ArrayList<OptionItem>(); for (int j = 0; j < 5; j++) { temp.add(new OptionItem(groupName, "Child " + j)); } children.add(temp); } children.get(0).get(3).setSelected(true); children.get(5).get(2).setSelected(true); children.get(8).get(1).setSelected(true); children.get(3).get(4).setSelected(true); ExpandableListView elv = (ExpandableListView) findViewById(R.id.expandableListView1); elv.setAdapter(new ExpandableAdapter(groups, children)); } public static class ViewHolder { protected CheckBox cb; } public class ExpandableAdapter extends BaseExpandableListAdapter { private List<List<OptionItem>> list; private ArrayList<String> groups; public ExpandableAdapter(ArrayList<String> groups, List<List<OptionItem>> children) { this.groups = groups; this.list = children; } @Override public Object getChild(int groupPosition, int childPosition) { if (list != null && list.size() > groupPosition && list.get(groupPosition) != null) { if (list.get(groupPosition).size() > childPosition) return list.get(groupPosition).get(childPosition); } return null; } @Override public long getChildId(int groupPosition, int childPosition) { return childPosition; } @Override public View getChildView(final int groupPosition, final int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { View view = null; if (convertView == null) { view = getLayoutInflater().inflate(R.layout.row, null); final ViewHolder childHolder = new ViewHolder(); childHolder.cb = (CheckBox) view.findViewById(R.id.checkBox1); childHolder.cb .setOnCheckedChangeListener(new OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton button, boolean isChecked) { OptionItem item = (OptionItem) childHolder.cb .getTag(); item.setSelected(button.isChecked()); } }); view.setTag(childHolder); childHolder.cb.setTag(list.get(groupPosition).get(childPosition)); } else { view = convertView; ((ViewHolder) view.getTag()).cb.setTag(list.get(groupPosition).get(childPosition)); } ViewHolder holder = (ViewHolder) view.getTag(); holder.cb.setChecked(list.get(groupPosition).get(childPosition) .isSelected()); holder.cb.setText(list.get(groupPosition).get(childPosition) .getChildName()); return view; } @Override public int getChildrenCount(int groupPosition) { if (list != null && list.size() > groupPosition && list.get(groupPosition) != null) return list.get(groupPosition).size(); return 0; } @Override public Object getGroup(int groupPosition) { if (groups != null && groups.size() > groupPosition) return groups.get(groupPosition); return null; } @Override public int getGroupCount() { if (groups != null) return groups.size(); return 0; } @Override public long getGroupId(int groupPosition) { return groupPosition; } @Override public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { if (convertView == null) { convertView = getLayoutInflater().inflate( android.R.layout.simple_expandable_list_item_1, null); } TextView tv = (TextView) convertView .findViewById(android.R.id.text1); tv.setText(groups.get(groupPosition)); return convertView; } @Override public boolean hasStableIds() { return true; } @Override public boolean isChildSelectable(int groupPosition, int childPosition) { return true; } } 

Y la clase del modelo de datos:

 public class OptionItem { private String groupName; private String childName; private boolean selected; public OptionItem(String group, String child) { this.groupName = group; this.childName = child; selected = false; } public void setGroupName(String name) { this.groupName = name; } public void setChildName(String name) { this.childName = name; } public void setSelected(boolean selected) { this.selected = selected; } public String getGroupName() { return groupName; } public String getChildName() { return childName; } public boolean isSelected() { return selected; } 

Por favor ayuda. Gracias por adelantado.

EDIT : El registro es como sigue:

  02-15 12:40:03.224: E/AndroidRuntime(423): FATAL EXCEPTION: main 02-15 12:40:03.224: E/AndroidRuntime(423): java.lang.ClassCastException: com.test.OptionItem 02-15 12:40:03.224: E/AndroidRuntime(423): at com.test.ExpandableActivity$ExpandableAdapter.getChildView(ExpandableActivity.java:106) 02-15 12:40:03.224: E/AndroidRuntime(423): at android.widget.ExpandableListConnector.getView(ExpandableListConnector.java:450) 02-15 12:40:03.224: E/AndroidRuntime(423): at android.widget.AbsListView.obtainView(AbsListView.java:1315) 02-15 12:40:03.224: E/AndroidRuntime(423): at android.widget.ListView.makeAndAddView(ListView.java:1727) 02-15 12:40:03.224: E/AndroidRuntime(423): at android.widget.ListView.fillDown(ListView.java:652) 02-15 12:40:03.224: E/AndroidRuntime(423): at android.widget.ListView.fillSpecific(ListView.java:1284) 02-15 12:40:03.224: E/AndroidRuntime(423): at android.widget.ListView.layoutChildren(ListView.java:1558) 02-15 12:40:03.224: E/AndroidRuntime(423): at android.widget.AbsListView.onLayout(AbsListView.java:1147) 02-15 12:40:03.224: E/AndroidRuntime(423): at android.view.View.layout(View.java:7035) 02-15 12:40:03.224: E/AndroidRuntime(423): at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1249) 02-15 12:40:03.224: E/AndroidRuntime(423): at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1125) 02-15 12:40:03.224: E/AndroidRuntime(423): at android.widget.LinearLayout.onLayout(LinearLayout.java:1042) 02-15 12:40:03.224: E/AndroidRuntime(423): at android.view.View.layout(View.java:7035) 02-15 12:40:03.224: E/AndroidRuntime(423): at android.widget.FrameLayout.onLayout(FrameLayout.java:333) 02-15 12:40:03.224: E/AndroidRuntime(423): at android.view.View.layout(View.java:7035) 02-15 12:40:03.224: E/AndroidRuntime(423): at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1249) 02-15 12:40:03.224: E/AndroidRuntime(423): at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1125) 02-15 12:40:03.224: E/AndroidRuntime(423): at android.widget.LinearLayout.onLayout(LinearLayout.java:1042) 02-15 12:40:03.224: E/AndroidRuntime(423): at android.view.View.layout(View.java:7035) 02-15 12:40:03.224: E/AndroidRuntime(423): at android.widget.FrameLayout.onLayout(FrameLayout.java:333) 02-15 12:40:03.224: E/AndroidRuntime(423): at android.view.View.layout(View.java:7035) 02-15 12:40:03.224: E/AndroidRuntime(423): at android.view.ViewRoot.performTraversals(ViewRoot.java:1045) 02-15 12:40:03.224: E/AndroidRuntime(423): at android.view.ViewRoot.handleMessage(ViewRoot.java:1727) 02-15 12:40:03.224: E/AndroidRuntime(423): at android.os.Handler.dispatchMessage(Handler.java:99) 02-15 12:40:03.224: E/AndroidRuntime(423): at android.os.Looper.loop(Looper.java:123) 02-15 12:40:03.224: E/AndroidRuntime(423): at android.app.ActivityThread.main(ActivityThread.java:4627) 02-15 12:40:03.224: E/AndroidRuntime(423): at java.lang.reflect.Method.invokeNative(Native Method) 02-15 12:40:03.224: E/AndroidRuntime(423): at java.lang.reflect.Method.invoke(Method.java:521) 02-15 12:40:03.224: E/AndroidRuntime(423): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 02-15 12:40:03.224: E/AndroidRuntime(423): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 02-15 12:40:03.224: E/AndroidRuntime(423): at dalvik.system.NativeStart.main(Native Method) 

EDIT: He intentado de nuevo, todavía está dando la misma excepción. Aquí están las importaciones que he añadido:

 import java.util.ArrayList; import java.util.List; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.ViewGroup; import android.widget.BaseExpandableListAdapter; import android.widget.CheckBox; import android.widget.CompoundButton; import android.widget.CompoundButton.OnCheckedChangeListener; import android.widget.ExpandableListView; import android.widget.TextView; 

  • ExpandableListView Animación de diapositivas en el grupo expand / collapse
  • ¿Cómo mostrar más de 3 niveles de Vista de lista expandible?
  • Android: 2 o más ExpandableListView dentro del Gaveta de navegación
  • Animación para expandibleListView
  • Android ExpandableListView con animación
  • Multi-layered ExpandableListView
  • Guardar y restaurar el estado expandido / colapsado de un ExpandableListActivity
  • Android ExpandableListView y base de datos SQLite
  • 2 Solutions collect form web for “Casilla de verificación en ExpandableListView”

    Intento su código, y no hay problemas: Introduzca aquí la descripción de la imagen

    Por favor agregue sus importaciones, tal vez haya algunos problemas.

    Gracias a Natali, he descubierto el problema. El problema estaba en el archivo de disposición "row.xml". Yo estaba usando:

     <?xml version="1.0" encoding="utf-8"?> <CheckBox xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/checkBox1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="CheckBox" /> 

    Como el diseño. Pero cuando lo cambié a:

     <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <CheckBox android:id="@+id/checkBox1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="CheckBox" /> </LinearLayout> 

    Funcionó a las mil maravillas. Supongo que esto es un error. Gracias a Natali por ayudarme en averiguar esto.

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.