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)
…
- Mantenimiento de los estados de la casilla de verificación en listview con CursorAdapter
- Android CheckBoxPreference - un / marque todas las preferencias
- ¿Cambiar el estado del CheckBox en el elemento de lista?
- Lista personalizada haciendo clic con las casillas de verificación
- Cambiar colorControlActivated color programmically
- 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í.
- Agregar CheckBox a la vista de fila ListView hace que la fila no haga clic
- Casilla de verificación desmarcada cuando hago scrolllistview en Android
- Cuándo usar CheckBox y cuando cambie
- Android Cómo saber qué casilla de verificación está seleccionada
- Cambiar la casilla de verificación colorAccent en tiempo de ejecución mediante programación
- Iniciar otra actividad si la casilla está marcada
- ¿Es eso un error con CheckBox en android?
- Vista de lista de Android con el problema de la casilla de verificación
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?