9

Im essayant de comprendre comment construire une vue qui contient (beaucoup de):ANDROID - ExpandableListView

  • PARENT1 (checkable, extensible)
  • CHILD1 (BOUTON RADIO)
  • CHILD2 (BOUTON RADIO)

...

  • parent2 (checkable, exp andable)
  • CHILD1 (checkable)
  • CHILD2 (checkable)

...

Le point est que parent doit être checkable et sur la base que les enfants doivent changer l'icône. Est-ce que quelqu'un1 peut me diriger dans la bonne direction, parce que de ce que j'ai trouvé rien ne semble fonctionner pour moi.

Répondre

16

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:

  1. cr Utilisez les mises en page adéquates pour votre moteur de rendu d'élément parent et l'élément enfant renderer
  2. 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).

+0

thanx rekaszeru. Puisque je suis un débutant, voudriez-vous partager un échantillon de travail? – no9

+1

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

+0

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