45 votes

Comment obtenir tous les éléments cochés d'un ListView?

J'ai quelques questions que je n'ai pas pu comprendre.

J'essaie d'obtenir tous les éléments vérifiés d'un ListView mais:

  1. Si je vérifie puis décoche un élément, il est renvoyé comme "vérifié" par la fonction getCheckedItemPositions()

  2. Je ne sais pas comment puis-je répéter cela:

     SparseBooleanArray checked = list.getCheckedItemPositions();
     

81voto

Jarett Points 1730

Les autres réponses utilisant SparseBooleanArray sont presque correctes, mais il leur manque une chose importante: SparseBooleanArray.size() ne renverra parfois que le compte des valeurs true . Une implémentation correcte qui itère sur tous les éléments de la liste est:

 SparseBooleanArray checked = list.getCheckedItemPositions();

for (int i = 0; i < list.getAdapter().getCount(); i++) {
    if (checked.get(i)) {
        // Do something
    }
}
 

11voto

sergi Points 364

J'ai résolu mon cas avec ceci:

 public class MyAdapter extends BaseAdapter{
    public HashMap<String,String> checked = new HashMap<String,String>();
....
    public void setCheckedItem(int item) {


        if (checked.containsKey(String.valueOf(item))){
            checked.remove(String.valueOf(item));
        }

        else {
            checked.put(String.valueOf(item), String.valueOf(item));
        }
    }
        public HashMap<String, String> getCheckedItems(){
        return checked;
    }
}
 

Pour définir un élément est vérifié:

 public class FileBrowser extends Activity implements OnClickListener{        
private ListView list;

    ...
    list.setOnItemClickListener(new OnItemClickListener(){

        @Override
        public void onItemClick(AdapterView<?> parent, View view, int item,
                long id) {

                        BrowserAdapter bla = (BrowserAdapter) parent.getAdapter();
                        bla.setCheckedItem(item);
                    }
    });
 

Ensuite, pour obtenir les éléments vérifiés en dehors de la classe ..

 MyAdapter bAdapter;    
Iterator<String> it = bAdapter.getCheckedItems().values().iterator();
                    for (int i=0;i<bAdapter.getCheckedItems().size();i++){
                        //Do whatever
                        bAdapter.getItem(Integer.parseInt(it.next());
                    }
 

J'espère que cela peut aider quelqu'un.

8voto

Jarett réponse est super, mais ce devrait être un peu plus rapide, puisque c'est seulement de vérifier les éléments dans le tableau fragmenté qui sont présents dans le sous-jacent array (seulement ceux qui peuvent être vrai):

SparseBooleanArray checkedItemPositions = listView.getCheckedItemPositions();
    final int checkedItemCount = checkedItemPositions.size();
    for (int i = 0; i < checkedItemCount; i++) {
        int key = checkedItemPositions.keyAt(i);
        if (checkedItemPositions.get(key)) {
            doSomething(key);
        } else {
            // item was in the sparse array, but not checked.
        }
    }

Pro astuce: regardez la source de SparseBooleanArray, il est assez simple de la classe:

http://grepcode.com/file_/repository.grepcode.com/java/ext/com.google.android/android/4.0.3_r1/android/util/SparseBooleanArray.java/?v=source

6voto

Chris Points 136

Vous pouvez parcourir le SparseBooleanArray à l'aide d'une boucle for et la SparseBooleanArray taille() et get(index) des méthodes.

EDIT 3/2/2014: les Gens ont souligné que SparseBooleanArray de la méthode size() renvoie le nombre de valeurs contrôlées, plutôt que la vraie longueur de la matrice, donc, j'ai réparé ma réponse à tenir compte de cela. Essentiellement, c'est la même chose, sauf que plutôt que d'itération pour la longueur du tableau, on itère jusqu'à ce que nous avons trouvé tous les éléments cochés. Puisque nous ne se soucient que du nombre de points contrôlés, il est sans importance que, avec cette méthode, on ne peut pas réellement obtenir à la fin du tableau (on ne voit rien au-delà du dernier élément coché).

SparseBooleanArray checked = list.getCheckedItemPositions();

int numChecked = checked.size();

for (int i = 0; numChecked > 0; i++){
    if (checked.get(i)){
        //the item at index i is checked, do something
        numChecked--; //We found a checked item, so decrement the number of checked items remaining
    }
    else
        //the item is not checked, do something else
}

6voto

Ben Jakuben Points 2049

Mon cerveau n'aimait pas parcourir le SparseBooleanArray et je n'avais pas besoin d'un adaptateur personnalisé, donc ce qui suit était un peu plus intuitif pour moi:

  1. N'oubliez pas d'utiliser CHOICE_MODE_MULTIPLE dans onCreate ():

    getListView().setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);

  2. Utilisez la méthode suivante pour en obtenir une liste de tableaux:

     // This example is to get an ArrayList of names (Strings)
    protected ArrayList<String> getNames() {
        ArrayList<String> names = new ArrayList<String>();
    
        for (int i = 0; i < getListView().getCount(); i++) {
            if (getListView().isItemChecked(i)) {
                // Do whatever you need to in here to get data from
                // the item at index i in the ListView
                names.add(mUsers.get(i).getName());
            }
        }
    
        return names;
    } 
     

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