ANDROID – ExpandableListView

Estoy intentando descubrir cómo crear una vista que contenga (muchos de):

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

  • PARENT2 (seleccionable, ampliable)
  • CHILD1 (VERIFICADO)
  • CHILD2 (VERIFICADO)

El punto es que los padres deben poder marcarse y basarse en que los niños tienen que cambiar el ícono. Puede alguien señalarme en la dirección correcta, porque por lo que he encontrado, nada parece funcionar para mí.

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

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

Si es así, solo tienes que hacer dos cosas:

  1. crear diseños apropiados para el renderizador de elementos padre y el renderizador de elementos hijo
  2. expanda BaseExpandableListAdapter para crear la lista usted mismo.

Aquí hay una pequeña muestra de lo que tengo en mente:
layout / grouprow.xml :

      

diseño / childrow.xml :

      

Clase MyELAdapter : He declarado esto como una clase interna de MyExpandableList, por lo que podría llegar a la lista de padres directamente, sin tener que pasarlo 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 parents; 

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

 this.setListAdapter(new MyELAdapter()); 

y eso es. Tiene una lista ampliable comprobable, y en el CheckUpdateListener onCheckedChanged(CompoundButton buttonView, boolean isChecked) puede actualizar el estado verificado de su objeto padre.

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

Actualizar

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