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).

  • Casilla de verificación en CursorAdapter
  • Fila listView personalizada con casilla de verificación y marcas de verificación de ahorros en la rotación
  • Android: vinculación de datos de una base de datos a un CheckBox en un ListView?
  • Cambiar colorControlActivated color programmically
  • Cambiar el resumen de CheckBoxPreference basado en el estado marcado
  • No se puede usar la casilla de verificación en eclipse con el complemento de adt de Android
  • Cómo comprobar el CheckBox de ListView cuando se hace clic en el elemento?
  • El listview personalizado con una sola casilla de verificación se selecciona uno a la vez
  • Error al inflacionar la clase android.widget.CheckBox
  • Las guías de la API de Android son un poco confusas para mí sobre el atributo android: onClick XML
  • Android Espresso - Haga clic en la casilla de verificación si no está marcada
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.