ANDROID – ExpandableListView

Estoy tratando de averiguar cómo construir una vista que contiene (muchos de):

  • PARENT1 (comprobable, ampliable)
  • CHILD1 (BOTÓN DE RADIO)
  • CHILD2 (BOTÓN DE RADIO)

  • PARENT2 (comprobable, ampliable)
  • CHILD1 (COMPROBABLE)
  • CHILD2 (COMPROBABLE)

El punto es que el padre tiene que ser controlable y basado en que los niños tienen que cambiar el icono. ¿Puede alguien me apunta en la dirección correcta, porque de lo que encontré nada parece funcionar para mí.

Supongo que usted tiene sus datos estructurados de alguna manera, como: ArrayList donde

  • Padre {nombre: String, checked: boolean, children: ArrayList} y
  • Niño {name: String}

Si es así, sólo tiene que hacer dos cosas:

  1. Crear diseños adecuados para el procesador de elementos padre y el procesador de elementos secundarios
  2. Expanda BaseExpandableListAdapter para crear la lista usted mismo.

Aquí hay una pequeña muestra de lo que está en mi mente:
Layout / grouprow.xml :

<?xml version="1.0" encoding="utf-8"?> <RelativeLayout android:orientation="horizontal" android:gravity="fill" android:layout_width="fill_parent" android:layout_height="wrap_content" xmlns:android="http://schemas.android.com/apk/res/android"> <!-- PARENT --> <TextView android:id="@+id/parentname" android:paddingLeft="5px" android:paddingRight="5px" android:paddingTop="3px" android:paddingBottom="3px" android:textStyle="bold" android:textSize="18px" android:layout_gravity="fill_horizontal" android:gravity="left" android:layout_height="wrap_content" android:layout_width="wrap_content" /> <CheckBox android:id="@+id/checkbox" android:focusable="false" android:layout_alignParentRight="true" android:freezesText="false" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="5px" /> </RelativeLayout> 

Layout / childrow.xml :

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="wrap_content" android:padding="0px"> <!-- CHILD --> <TextView android:id="@+id/childname" android:paddingLeft="15px" android:paddingRight="5px" android:focusable="false" android:textSize="14px" android:layout_marginLeft="10px" android:layout_marginRight="3px" android:layout_width="fill_parent" android:layout_height="wrap_content" /> </LinearLayout> 

MyELAdapter class : He declarado esto como una clase interna de MyExpandableList, por lo que podría llegar a la lista de los padres directamente, sin tener que pasar como parámetro.

 private class MyELAdapter extends BaseExpandableListAdapter { private LayoutInflater inflater; public MyELAdapter() { inflater = LayoutInflater.from(MyExpandableList.this); } @Override public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parentView) { final Parent parent = parents.get(groupPosition); convertView = inflater.inflate(R.layout.grouprow, parentView, false); ((TextView) convertView.findViewById(R.id.parentname)).setText(parent.getName()); CheckBox checkbox = (CheckBox) convertView.findViewById(R.id.checkbox); checkbox.setChecked(parent.isChecked()); checkbox.setOnCheckedChangeListener(new CheckUpdateListener(parent)); if (parent.isChecked()) convertView.setBackgroundResource(R.color.red); else convertView.setBackgroundResource(R.color.blue); return convertView; } @Override public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parentView) { final Parent parent = parents.get(groupPosition); final Child child = parent.getChildren().get(childPosition); convertView = inflater.inflate(R.layout.childrow, parentView, false); ((TextView) convertView.findViewById(R.id.childname)).setText(child.getName()); return convertView; } @Override public Object getChild(int groupPosition, int childPosition) { return parents.get(groupPosition).getChildren().get(childPosition); } @Override public long getChildId(int groupPosition, int childPosition) { return childPosition; } @Override public int getChildrenCount(int groupPosition) { return parents.get(groupPosition).getChildren().size(); } @Override public Object getGroup(int groupPosition) { return parents.get(groupPosition); } @Override public int getGroupCount() { return parents.size(); } @Override public long getGroupId(int groupPosition) { return groupPosition; } @Override public void notifyDataSetChanged() { super.notifyDataSetChanged(); } @Override public boolean isEmpty() { return ((parents == null) || parents.isEmpty()); } @Override public boolean isChildSelectable(int groupPosition, int childPosition) { return true; } @Override public boolean hasStableIds() { return true; } @Override public boolean areAllItemsEnabled() { return true; } } 

Ya debe tener una clase pública MyExpandableList extends ExpandableListActivity que tiene un miembro:

 private ArrayList<Parent> parents; 

Después de asignar un valor a este miembro / cargar la lista de padres, también debe adjuntar el adaptador a esta vista:

 this.setListAdapter(new MyELAdapter()); 

y eso es. Tiene una lista verificable-expandible y en el CheckUpdateListener onCheckedChanged(CompoundButton buttonView, boolean isChecked) puede actualizar el estado marcado de su objeto primario.

Tenga en cuenta que el color de fondo se determina en el método getGroupView, por lo que no tiene que cambiarlo en ningún lugar, simplemente llame al método notifyDataSetChanged() del adaptador si es necesario.

Actualizar

Puede descargar el código fuente de muestra de este enlace . Es un proyecto de eclipse, pero si está utilizando otro entorno de desarrollador, simplemente copie los archivos de origen necesarios (java + xml).

  • El texto de CheckBox de Android no se muestra
  • Checkbox 'Checked' en ListView se restaura después de desplazarse
  • El listview personalizado con una sola casilla de verificación se selecciona uno a la vez
  • Cómo comprobar el CheckBox de ListView cuando se hace clic en el elemento?
  • Checkbox auto call onCheckedChange cuando se desplaza el listview?
  • Establecer el estado de las casillas de verificación en Multichoice AlertDialog en Android
  • Cómo deshabilitar un grupo de radio hasta que se marque la casilla de verificación
  • Cómo seleccionar toda la casilla de verificación en listview personalizado de la actividad en android
  • CheckBox se desactiva en desplazamiento en una vista de lista personalizada
  • ¿Cómo puedo distinguir si Switch, Checkbox Value es cambiado por el usuario o programáticamente (incluyendo por retención)?
  • Cambiar el resumen de CheckBoxPreference basado en el estado marcado
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.