Je suppose, vous avez vos données structurées en quelque sorte, comme: ArrayList où
- Parent {name: String, vérifié: booléen, enfants: ArrayList} et
- enfant {name: String}
Si oui, il suffit de faire deux choses:
- cr Utilisez les mises en page adéquates pour votre moteur de rendu d'élément parent et l'élément enfant renderer
- développez BaseExpandableListAdapter à développez la liste vous-même.
Voici un petit échantillon de ce qui est dans mon esprit:
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: J'ai déclaré cela comme une classe interne de MyExpandableList, afin que je puisse accéder directement à la liste des parents, sans avoir à le passer en paramètre.
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;
}
}
Vous devez déjà avoir une classe publique MyExpandableList extends ExpandableListActivity
qui a un membre:
private ArrayList<Parent> parents;
après avoir attribué une valeur à ce membre/charger la liste des parents, vous devez également joindre votre adaptateur à cette vue:
this.setListAdapter(new MyELAdapter());
et c'est tout. Vous avez une liste modifiable-vérifiable et dans la méthode onCheckedChanged(CompoundButton buttonView, boolean isChecked)
de CheckUpdateListener
vous pouvez mettre à jour l'état vérifié de votre objet parent.
Notez que la couleur d'arrière-plan est déterminée dans la méthode getGroupView. Vous n'avez donc pas besoin de la modifier, appelez simplement la méthode notifyDataSetChanged()
de l'adaptateur si nécessaire.
Mise à jour
vous pouvez télécharger le code source d'échantillon de this link. C'est un projet d'éclipse, mais si vous utilisez un autre environnement de développement, copiez simplement les fichiers source nécessaires (java + xml).
thanx rekaszeru. Puisque je suis un débutant, voudriez-vous partager un échantillon de travail? – no9
chose sûre, je vais juste besoin de quelques minutes pour en construire un. Il serait utile cependant si je saurais d'où vous obtenez les données (serveur ou local). – rekaszeru
Si vous le pouvez, veuillez construire un exemple très simple (juste quelques données de test avec un tas de tableaux). J'obtiens le type de service XML de données tru conçu pour l'arborescence compacte du framework. Je vais devoir formater les données moi-même, mais à ce stade, je ne sais pas encore comment. En ce moment, je suis intéressé par la structure de la liste des biens perdus. Checkboxes, radiobuttons etc – no9