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)
…
- Al desplazar Custom ListView, el valor de la casilla de verificación cambia
- ListView de Android con casilla de verificación: desactiva automáticamente
- Cambiar el color de fondo del checkbox en android
- Mantenimiento de los estados de la casilla de verificación en listview con CursorAdapter
- android cómo establecer el icono de la casilla de verificación en el derecho?
- 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í.
- El texto de CheckBox de Android no se muestra
- Iniciar otra actividad si la casilla está marcada
- Cambiar el tamaño de una casilla de verificación en android
- Cómo obtener todos los elementos seleccionados de un ListView?
- Cómo reemplazar el color CheckBox con AppCompat
- CheckBox Hacer la listaNo se puede hacer clic en el elemento
- Android checkable listview
- Cómo agregar una casilla de verificación a un cuadro de diálogo de alerta
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:
- Crear diseños adecuados para el procesador de elementos padre y el procesador de elementos secundarios
- 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).
- Cómo invertir Geocode en google maps api 2 android
- Android: ¿Cómo puedo comprobar un elemento en particular en CheckView ListView?