android - collapsible - layout collapsemode parallax
ANDROID-ExpandableListView (1)
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:
- crear diseños apropiados para el renderizador de elementos padre y el renderizador de elementos hijo
- expanda BaseExpandableListAdapter para crear la lista usted mismo.
Aquí hay una pequeña muestra de lo que tengo en 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>
diseño / 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>
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<Parent> 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).