49 votes

Comment obtenir les éléments sélectionnés à partir de la vue Liste de sélection multiple

J'utilise un adaptateur de tableau et j'ajoute à cela une liste de tableaux de chaînes, la liste est multi-sélection, comment puis-je obtenir les valeurs des éléments de la liste cliqués?

 my_contacts_list.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
ArrayAdapter<String> adapter=new ArrayAdapter<String>(this, android.R.layout.simple_list_item_multiple_choice,conts_list);
  my_contacts_list.setAdapter(adapter);
 

J'essayais de faire ça,

 SparseBooleanArray positions = my_contacts_list.getCheckedItemPositions();
  int size=positions.size();
  int i=0;
  while(i <= size){
   conts_list.get(positions.get(i));
   i++;
  }
 

Mais position.get (i) est une liste de tableaux, comment récupérer alors les éléments sélectionnés?

47voto

Daren Robbins Points 919

SparseBooleanArray.get renvoie un booléen, mais je pense que vous devez le vérifier pour chaque position dans votre liste, par exemple

 int len = listView.getCount();
SparseBooleanArray checked = listView.getCheckedItemPositions();
for (int i = 0; i < len; i++)
 if (checked.get(i)) {
  String item = cont_list.get(i);
  /* do whatever you want with the checked item */
 }
 

46voto

Roger Keays Points 1158

Cette API est un gâchis. Voici ce qui fonctionne pour moi.

 SparseBooleanArray checked = tags.getCheckedItemPositions();
for (int i = 0; i < checked.size(); i++) {
    if(checked.valueAt(i) == true) {
        Tag tag = (Tag) tags.getItemAtPosition(checked.keyAt(i));
        Log.i("xxxx", i + " " + tag);
    }
}
 

17voto

Karl Points 141

Je crois que le moyen le plus rapide pour obtenir les informations de ce SparseArray est d'itérer sur les touches (en fait, je suis assez sûr que les solutions ci-dessus ne fonctionneront pas dans tous les cas). Le ListView entrera une paire (indice, vrai) dans le SparseBooleanArray pour chaque indice sélectionné.

Ainsi, le code pourrait ressembler à ceci:

 SparseBooleanArray checked = lv.getCheckedItemPositions();
int size = checked.size(); // number of name-value pairs in the array
for (int i = 0; i < size; i++) {
    int key = checked.keyAt(i);
    boolean value = checked.get(key);
    if (value)
        doSomethingWithSelectedIndex(key);
}
 

4voto

Shereef Marzouk Points 2095

Je pense que la réponse de Daren Robbins est erronée, voici ma réponse:

 ArrayList<String> ids = extras.getStringArrayList("commonids");
SparseBooleanArray checked = lv.getCheckedItemPositions();
for (int i = 0; i < checked.size(); i++) {
    if(checked.get(i))
        Log.i("CheckedItem", ids.get(checked.indexOfKey(i)));
}
 

Supposons que ids est une liste de tableaux avec la même taille que la vue de liste contenant les identifiants des éléments dans la vue de liste

3voto

Yiding Points 963

Le fait est que vous devez itérer tous les éléments de la vue liste, mais pas les positions cochées.

Définissez les variables:

  • listView (L'instance de vous ListView)
  • noms (ArrayList que vous êtes)
  • saveCheckedName (enregistrez tous les noms cochés dans cette liste)

      SparseBooleanArray checkedPositions = listView.getCheckedItemPositions();
        for (int i = 0; i < subjectListView.getCount(); i++) {
                        if (checkedPositions.get(i) == true) {
                            saveCheckedName.add(names.get(i));
                        }
                    }
     

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X