ANDROID – ExpandableListView

Je tente de comprendre comment créer une vue qui contient (plusieurs):

  • PARENT1 (checkable, extensible)
  • CHILD1 (BUT DE RADIO)
  • CHILD2 (BUT DE RADIO)

  • Comment créer un répondeur automatique pour Android
  • Comment puis-je endommager un périphérique?
  • Comodo SSL: ERR_CERT_AUTHORITY_INVALID sur Chrome mobile et Opera mobile (Android)
  • Problème d'installation Android SDK
  • Erreurs de rendu XML Prévisualisation d'Android N
  • Les types de mime disponibles pour Android?
    • PARENT2 (checkable, extensible)
    • CHILD1 (CHECKABLE)
    • CHILD2 (CHECKABLE)

    Le point est que le parent doit être vérifié et basé sur que les enfants doivent changer l'icône. Quelqu'un peut-il me montrer dans la bonne direction, parce que de ce que j'ai trouvé, rien ne semble fonctionner pour moi.

  • Définir la couleur d'arrière-plan pour la barre de titre de la boîte de dialogue?
  • Android Partagez Via Dialog
  • Requête HTTP POST avec autorisation sur Android
  • Le cycle de vie de la base de données Sqlite? Il est supprimé lorsque l'application est fermée?
  • Comment créer un aperçu vidéo dans Android?
  • AlertDialog Thème: Comment modifier la couleur du texte de l'élément?
  • One Solution collect form web for “ANDROID – ExpandableListView”

    Je suppose que vous avez structuré vos données de manière similaire, comme: ArrayList où

    • Parent {name: String, checked: boolean, children: ArrayList} et
    • Enfant {nom: Chaîne}

    Si c'est le cas, il suffit de faire deux choses:

    1. Créez les mises en page appropriées pour votre processeur d'élément principal et votre représentant d'élément enfant
    2. Développez BaseExpandableListAdapter pour créer la liste vous-même.

    Voici un petit échantillon de ce qui m'intéresse:
    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> 

    Classe MyELAdapter : J'ai déclaré cela comme une classe interne de MyExpandableList, afin que je puisse accéder directement à la liste des parents sans devoir passer comme 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 / chargez la liste des parents, vous devez également joindre votre adaptateur à cette vue:

     this.setListAdapter(new MyELAdapter()); 

    et c'est tout. Vous disposez d'une liste CheckUpdateListener et extensible, et dans la CheckUpdateListener onCheckedChanged(CompoundButton buttonView, boolean isChecked) , 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, donc vous ne devez pas la changer n'importe où, appelez simplement la méthode notifyDataSetChanged() la carte si nécessaire.

    Mettre à jour

    Vous pouvez télécharger l'exemple de code source à partir de ce lien . Il s'agit d'un projet d'éclipse, mais si vous utilisez un autre environnement de développement, il suffit de copier les fichiers sources nécessaires (java + xml).

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.