Pourquoi est-ListView.getCheckedItemPositions() ne retourne pas de valeurs correctes?
L'application dispose d'un ListView avec sélection multiple est activé, dans l'INTERFACE utilisateur qu'il fonctionne comme prévu. Mais quand je lis les valeurs à l'aide de ce code:
Log.i(TAG,"Entered SearchActivity.saveCategoryChoice()");
SparseBooleanArray checkedPositions = categorySelector.getCheckedItemPositions();
Log.i(TAG,"checkedPositions: " + checkedPositions.size());
if (checkedPositions != null) {
int count = categoriesAdapter.getCount();
for ( int i=0;i<count;i++) {
Log.i(TAG,"Selected items: " + checkedPositions.get(i));
}
}
- Je obtenir cette sortie, quel que soit son état de chaque case est en:
Entered SearchActivity.saveCategoryChoice()
checkedPositions: 0
Selected items: false
Selected items: false
Selected items: false
Selected items: false
Selected items: false
Selected items: false
Selected items: false
Selected items: false
Selected items: false
Selected items: false
Selected items: false
Selected items: false
Selected items: false
Selected items: false
Selected items: false
Selected items: false
Selected items: false
La SparseBooleanArray semble renvoyer false pour tout inexistante, de sorte que la source des problèmes semble être que getCheckedItemPositions() retourne un tableau vide. La méthode est de se comporter comme si il n'y a pas d'éléments dans la liste, mais il y a des.
Je peux le voir dans les docs qu'aucune valeur n'est renvoyée lorsque la liste n'est pas défini comme la multi-sélection, mais il est, à l'aide de cette instruction:
categorySelector.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
Dans mon scénario, la carte que j'utilise est une sous-classe de ArrayAdapter, et (sans preuves solides) je soupçonne que cela pourrait être la cause, mais je ne vois pas pourquoi cela ne fonctionnerait pas.
- Dommage que je n'ai pas vu cette question (ans) plus tôt, mais comment avez-vous vérifier les éléments de la liste? Il n'est ni une erreur évidente dans le code ci-dessus, ni dans le résultat. Cela devrait fonctionner si vous définissez l'état activé avec categorySelector.setItemChecked(int position, une valeur booléenne).
Vous devez vous connecter pour publier un commentaire.
kcoppock est droit, vous devez utiliser valueAt(), le code de travail doit être
Je me souviens avoir eu un problème avec moi-même a tout à l'arrière. Ici est ma question précédente, ce qui n'est pas directement liée à votre problème, mais contient du code qui peut vous aider. Ce que vous voulez faire est d'essayer en utilisant
checkedPositions.valueAt(int index)
plutôt quecheckedPositions.get(int index)
. Je pense que peut être ce que vous cherchez.Je ne sais toujours pas pourquoi, mais dans mon scénario,
getCheckedItemPositions()
retourne false valeurs pour tous les éléments. Je ne vois pas un moyen d'utiliser les méthodes sur la liste pour obtenir les valeurs booléennes out. Le SparseBooleanArray objet ne semble pas avoir de données du monde réel en elle. Je crois que cela peut être à cause d'un caprice de ma mise en œuvre, peut-être que j'ai sous-classé ArrayAdapter. C'est frustrant, les questions de ce genre sont en temps réel-les égoutter.De toute façon, la solution que j'ai utilisée, c'est de joindre un gestionnaire pour chaque Case à cocher individuellement ListView les lignes sont créées. Donc, à partir de
ListView.getView()
j'appelle cette méthode:SparseBooleanArray
avant de compensation les etats vérifiés (automatiquement).Il arrive si vous n'avez pas à choisir la bonne ressource pour les montrer à vos différents éléments. Il fonctionne très bien si vous choisissez de ressources intégrées android.R.de mise en page.simple_list_item_multiple_choice. La méthode
getCheckedItemPositions
est couplé d'une certaine façon à la ressource.Aucune des solutions ci-dessus ont fonctionné pour moi, à la place je reçois chaque enfant (un checkedTextView) à partir de la liste et voir si elle est cochée ou non:
Il n'y a pas besoin de gérer l'cochant/décochant des éléments dans la liste. Il le fait déjà sur son propre.
Ce qui ne semble pas documenté, c'est que la liste ne peut le faire que si:
ListAdapter
est définie etListAdapter
sont stable.Le troisième point a été ce qui m'a rendu fou pendant un certain temps.
Je ne suis pas sûr de ce que "stable" signifie (je suppose que les id ne changera jamais le fait que la liste est affichée).
Aussi loin que la ListView, cela signifie que la méthode
hasStableIds()
dansListAdapter
renvoie la valeur true.J'ai créé un simple sous-classe de
ArrayAdapter
comme ceci:(Vous avez déjà votre sous-classe, donc il suffit d'ajouter le
hasStableIds
override)Bien sûr, on doit ajouter le constructeur qui a été en utilisant avec
ArrayAdapter
.Une fois que vous utilisez cette classe comme votre
ListAdapter
,getCheckedItemPositions()
se comporte comme prévu.Une dernière remarque:
setChoiceMode
doit être appelée APRÈS la définition de la liste de l'adaptateur.C'est un vieux thread mais depuis ce qui, fondamentalement, est arrivé en premier dans le courant de recherche Google, voici un moyen rapide pour comprendre ce
listView.getCheckedItemPositions()
n':À moins que l'Élément de la liste n'était pas "basculé" à tous dans votre Liste, il ne sera pas ajouté à la SparseBooleanArray qui est retourné par
listView.getCheckedItemPositions()
Mais alors, vous avez vraiment ne voulez pas que vos utilisateurs à cliquer sur chaque élément de la liste à "correctement" ajouter à l'retourné SparseBooleanArray droit?
Donc vous avez besoin de combiner l'utilisation de valueAt() ET keyAt() de la SparseBooleanArray pour cela.
SparseBooleanArray checkedArray = listView.getCheckedItemPositions()
effacer les éléments qui sont actuellement désactivée, mais ont été contrôlés dans le passé!Ce réglage fixe pour moi.
Changement de la méthode getView de sorte que "int" est "final int position".
Puis le faire avec votre case:
Permettez-moi de préciser.
la liste est une référence à la listview et dans mon cas, la carte est un intérieur de classe dans la boîte de dialogue de la tenue de la liste.
J'ai trouvé ce fil par le fait d'avoir le même problème, mais je pense que je dois venir avec une solution qui a fonctionné pour moi pour unkown raisons. Chaque fois que j'ai essayé d'obtenir une valeur que je n'ai rien, mais si je boucle par le biais de la configuration de la liste de tous à faux il a commencé à travailler comme prévu.
En fait, c'était une fonctionnalité que j'avais mis en place là où l'utilisateur peut soit "Sélectionner Tout" ou "Désélectionner Tout". Je lance cette méthode dans mon onCreate.
Maintenant, toutes mes valeurs sont correctes. Pour obtenir les valeurs, dans mon cas, il suffit de Chaînes.
J'espère que cela aide quelqu'un.
J'ai aussi utilisé la solution gyller suggère qu'implique le "lancement" de la liste
ListView lv = getListView();
for (int i = 0; i < lv.getCount(); i++) {
lv.setItemChecked(i, false);
}
avant d'appeler getCheckItemPositions(), et il a cessé de produire des résultats erronés!
alors que je ne crois pas, j'ai essayé de chaque variante décrite ici, ici, est celle qui a fonctionné pour moi 🙂
Et plus tard
Je suis accédant à la position + 1 en raison d'un en-tête de la vue que ma liste est en place.
HTH
pour chaque holer de la case à cocher je suis en utilisant le stocker dans le tableau
sur le clic du bouton
N'est-il pas une différence fondamentale entre
'selected'
et'checked'
?Suspect que vous voulez
setItemChecked()
à partir d'unOnItemSelectedListener
...il suffit d'aller à la xml lorsque votre liste est défini et mis en propriété
mon xmlfile
et puis dans votre javafile que:-