ExpandableListView - conserve l'enfant sélectionné dans un état "pressé"
Je suis en utilisant un ExpandableListView dans un menu de navigation de gauche pour un écran de la tablette.
Lorsqu'un utilisateur appuie sur un enfant d'un groupe dans ma liste extensible, j'aimerais garder l'enfant dans l'état activé de sorte que l'utilisateur ne sait pour quel enfant par la main droite de contenu est affiché.
Pour une ListView, j'ai été en mesure de réaliser cet effet avec cette ligne dans le code:
getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE);
puis en appliquant ce sélecteur:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_activated="true" android:drawable="@drawable/menu_item_pressed" />
<item android:state_pressed="false" android:state_focused="false" android:drawable="@drawable/menu_item_normal" />
<item android:state_pressed="true" android:drawable="@drawable/menu_item_pressed" />
<item android:state_focused="true" android:state_pressed="false" android:drawable="@drawable/menu_item_pressed" />
La "state_activiated" est vrai que sur la liste élément après élément de liste est pressé.
J'espérais cette même technique pourrait fonctionner pour mon expandableListView mais il n'a pas. J'ai utilisé:
getExpandableListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE);
et ensuite utilisé la même sélecteur ci-dessus, mais ça ne fonctionne pas. J'ai aussi essayé d'autres états comme l'state_selected et state_checked et ceux qui ne fonctionnent pas non plus.
Le sélecteur ci-dessus s'applique correctement la enfoncée et appuyez pas sur l'état. Il ressemble mais avec un ExpandableListView, l'état n'est pas "activé" après avoir appuyé sur un enfant.
Toute aide est appréciée. Merci!
source d'informationauteur Scott
Vous devez vous connecter pour publier un commentaire.
Effectuez les opérations suivantes sur ExpandableListView:
L'étape 1. Choix mode unique (qui Peut être fait en xml comme android:choiceMode = "singleChoice")
L'étape 2. Utilisez un sélecteur xml (android:listSelector = "@drawable/selector_list_item")
L'étape 3. Appel expandableListView.setItemChecked(index,true) dans onChildClick() de rappel.
indice est un 0 en fonction de l'indice de l'élément enfant calculé comme suit
Groupe 1 [index = 0]
Groupe 2 [index = 4]
Groupe 3 [index = 8]
Si nous avons la liste des en-têtes ainsi, ils seraient également en compte les valeurs d'indice.
Ici est un exemple:
J'ai fini par résoudre ce problème sans l'aide d'un sélecteur sur la vue enfant. L'adaptateur pour le expandableListView prend les données pour chaque groupe et de l'enfant. J'ai ajouté un "sélectionné" booléen pour l'enfant de données. Le fragment prend soin de correctement le réglage de chaque enfant sélectionné booléenne true ou false. Puis, dans la carte du "getChildView" la méthode, si l'enfant est "sélectionné" booléen est vrai, j'ai mis l'affichage de l'arrière-plan de ressources à mon "pressé" d'arrière-plan. Sinon je l'ai mis à la "pas pressé" d'arrière-plan. En faisant ceci, en plus de l'aide d'un sélecteur pour le textView sur l'enfant en vue de modifier la couleur du texte quand la touche est pressée atteint l'effet désiré.
Ci-dessous sont les choses à ma Fragment fait pour maintenir l'enfant est "sélectionné" booléen:
En outre maintenir une currentGroupPosition et currentChildPosition comme variables de classe. À l'aide de setRetainInstance = true permet que cela fonctionne correctement sur des choses comme l'écran pivote.
Déclarer à l'échelle mondiale:
Cette solution fonctionne pour moi (extensible affichage de la liste utilisée à l'intérieur en mode navigation):
Créer un menu personnalisé modèle, par exemple
Remplacer onChildClick de ExpandableListView
Remplacer onGroupClick de ExpandableListView
Remplacer getGroupView et getChildView
Que c'est!