¿Cómo obtener todos los elementos marcados de un ListView?

Tengo un par de preguntas que no he podido descifrar.

Estoy tratando de obtener todos los elementos ListView un ListView pero:

  1. Si marque y luego desmarque un elemento, se devuelve como “verificado” por la función getCheckedItemPositions()

  2. No sé cómo puedo repetir esto:

     SparseBooleanArray checked = list.getCheckedItemPositions(); 

Las otras respuestas que usan SparseBooleanArray son casi correctas, pero les falta una cosa importante: SparseBooleanArray.size() a veces solo devuelve el recuento de valores true . Una implementación correcta que itera sobre todos los elementos de la lista es:

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

Solucioné mi caso con esto:

 public class MyAdapter extends BaseAdapter{ public HashMap checked = new HashMap(); .... 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 getCheckedItems(){ return checked; } } 

Para establecer un elemento está marcado:

 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); } }); 

Luego, para obtener los artículos marcados de fuera de la clase.

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

Espero que pueda ayudar a alguien.

La respuesta de Jarett es genial, pero esto debería ser un poco más rápido, ya que solo se están verificando los elementos en la matriz dispersa que están presentes en la matriz subyacente (solo aquellos pueden ser ciertos):

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

Sugerencia: mira la fuente de SparseBooleanArray, es una clase bastante simple:

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

Puede iterar a través del SparseBooleanArray usando un ciclo for y los métodos SparseBooleanArray’s size () y get (index).

EDITAR 02/03/2014: La gente ha señalado que el método size () de SparseBooleanArray devuelve el número de valores comprobados, en lugar de la longitud real de la matriz, por lo que he reparado mi respuesta para dar cuenta de eso. Esencialmente es lo mismo, excepto que en lugar de iterar por la longitud de la matriz, iteramos hasta que hayamos encontrado todos los elementos marcados. Como solo nos importa la cantidad de elementos marcados, es irrelevante que con este método no lleguemos al final de la matriz (no veremos nada más allá del último elemento marcado).

 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 } 

A mi cerebro no le gustaba recorrer el SparseBooleanArray y no necesitaba un adaptador personalizado, por lo que lo siguiente fue un poco más intuitivo para mí:

  1. No olvides usar CHOICE_MODE_MULTIPLE en onCreate ():

    getListView().setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);

  2. Use el siguiente método para obtener una ArrayList de ellos:

     // This example is to get an ArrayList of names (Strings) 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]); } 

Acabo de ver la pregunta y estaba enfrentando el mismo problema.

Hay una solución más simple usando SparseBooleanArray para contar exactamente cuántos elementos se verifican. Este es mi procedimiento onClick:

 @Override public void onClick(View v) { switch(v.getId()) { case R.id.button: SparseBooleanArray a = listView.getCheckedItemPositions(); if(checked(vArray)>0) { String 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; } } 

El método verificado:

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

Resolverá ambos problemas de los elementos marcados.

Tuve el mismo problema y aquí está mi solución con SparseBooleanArray :

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

En su totalidad, esta es la solución que utilicé.

Donde pos es la posición del artículo 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() revelará cuántos elementos se seleccionan

selected.get(pos) devolverá verdadero si está seleccionado

Como se ha indicado, itera sobre todos los elementos que se seleccionaron:

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