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 coche et décoche un élément, il est renvoyé comme “vérifié” par la fonction getCheckedItemPositions()

  2. Je ne sais pas comment je peux parcourir ceci:

     SparseBooleanArray checked = list.getCheckedItemPositions(); 

Les autres réponses utilisant SparseBooleanArray sont presque correctes, mais il leur manque une chose importante: SparseBooleanArray.size() parfois uniquement le nombre de 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 } } 

J’ai résolu mon cas avec ceci:

 public class MyAdapter extends BaseAdapter{ public HashMap checked = new HashMap(); .... public void setCheckedItem(int item) { if (checked.containsKey(Ssortingng.valueOf(item))){ checked.remove(Ssortingng.valueOf(item)); } else { checked.put(Ssortingng.valueOf(item), Ssortingng.valueOf(item)); } } public HashMap 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 articles vérifiés en dehors de la classe.

 MyAdapter bAdapter; Iterator it = bAdapter.getCheckedItems().values().iterator(); for (int i=0;i 

J'espère que ça peut aider quelqu'un.

La réponse de Jarett est géniale, mais cela devrait être un peu plus rapide, car il ne s’agit que de vérifier les éléments du tableau fragmenté présents dans le tableau sous-jacent (seuls ceux-ci peuvent être vrais):

 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. } } 

Astuce Pro: regardez la source de SparseBooleanArray, c'est une classe assez simple:

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

Vous pouvez effectuer une itération dans SparseBooleanArray en utilisant une boucle for et les méthodes size () et get (index) de SparseBooleanArray.

EDIT 02/03/2014: Les gens ont fait remarquer que la méthode size () de SparseBooleanArray renvoie le nombre de valeurs vérifiées, plutôt que la longueur réelle du tableau. J’ai donc corrigé ma réponse pour en tenir compte. Essentiellement, c’est la même chose, sauf que plutôt que d’itérer sur la longueur du tableau, nous répétons jusqu’à ce que nous ayons trouvé tous les éléments cochés. Comme nous ne nous préoccupons que du nombre d’éléments vérifiés, il est sans importance qu’avec cette méthode, nous n’arrivons pas à la fin du tableau (nous ne verrons rien au-delà du dernier élément vérifié).

 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 } 

Mon cerveau n’aimait pas tourner sur SparseBooleanArray et je n’avais pas besoin d’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 (Ssortingngs) protected ArrayList getNames() { ArrayList names = new ArrayList(); 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; } 
  final long[] checkedIds = lv.getCheckItemIds(); for (int i = 0; i < checkedIds.length; i++) { Log.d("checkedIds", "id checked: " + checkedIds[i]); } 

Juste vu la question et je faisais face au même problème.

Il existe une solution plus simple utilisant SparseBooleanArray pour compter exactement combien d’éléments sont vérifiés. Ceci est ma procédure onClick:

 @Override public void onClick(View v) { switch(v.getId()) { case R.id.button: SparseBooleanArray a = listView.getCheckedItemPositions(); if(checked(vArray)>0) { Ssortingng vCheckedList = ""; for (int i = 0; i < nLength; i++) { if (a.valueAt(i) && i < nLength-1 && a.size()>1) vCheckedList += listView.getAdapter().getItem(vArray.keyAt(i))+"\n"; else if (a.valueAt(i)) vCheckedList += listView.getAdapter().getItem(vArray.keyAt(i)); } Toast.makeText(getApplicationContext(), vCheckedList+ " is checked", Toast.LENGTH_SHORT).show(); a.clear(); } else Toast.makeText(getApplicationContext(), "No Item is Selected", Toast.LENGTH_SHORT).show(); break; default: break; } } 

La méthode vérifiée:

 private int checked(SparseBooleanArray vArray) { int vCounter = 0; for(int i=0;i 

Cela résoudra les deux problèmes des éléments cochés.

J’ai eu le même problème et voici ma solution avec SparseBooleanArray :

 SparseBooleanArray checkedPositions = lv.getCheckedItemPositions (); int size = checkedPositions.size (); for (int i=0 ; i
		      	

Dans son intégralité, c’est la solution que j’ai utilisée.

Où pos est la position de l’élément Recyclerview

 SparseBooleanArray selected = new SparseBooleanArray(); //OnClick listener here or whatever you use to check or uncheck an item if (selected.get(pos, false)) { selected.delete(pos); } else { selected.put(pos, true); } 

selected.size() affichera le nombre d’éléments sélectionnés

selected.get(pos) renverra true s’il est sélectionné

Les éléments suivants, comme il a été indiqué, parcourent tous les éléments sélectionnés:

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