web-dev-qa-db-fra.com

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

J'ai une ou deux questions que je n'ai pas pu comprendre.

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

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

  2. Je ne sais pas comment puis-je parcourir ceci: 

    SparseBooleanArray checked = list.getCheckedItemPositions();
    
41
sergi

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 coché:

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 de l'extérieur 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 ça peut aider quelqu'un.

11
sergi

Les autres réponses utilisant SparseBooleanArray sont presque correctes, mais il leur manque une chose importante: SparseBooleanArray.size() retournera 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
    }
}
75
Jarett Millard

La réponse de Jarett est excellente, mais cela devrait être un peu plus rapide, car il ne vérifie que les éléments du tableau fragmenté présents dans le tableau sous-jacent (seuls ceux qui 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: 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

8
treesAreEverywhere

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

EDIT 3/2/2014: Des personnes ont signalé 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. En gros, c'est la même chose, sauf qu'au lieu d'itérer la longueur du tableau, nous itérons jusqu'à ce que tous les éléments cochés soient trouvés. Puisque nous ne nous soucions que du nombre d'éléments vérifiés, il est indifférent qu'avec cette méthode, nous ne puissions pas atteindre la fin du tableau (nous ne verrons rien après le 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
}
6
Chris
 final long[] checkedIds = lv.getCheckItemIds();
            for (int i = 0; i < checkedIds.length; i++) {
                Log.d("checkedIds", "id checked: " + checkedIds[i]);
            }
2
hrules6872

Je viens de voir la question et je faisais face au même problème.

Il existe une solution plus simple qui utilise SparseBooleanArray pour compter exactement le nombre d'éléments vérifiés

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

La méthode cochée:

private int checked(SparseBooleanArray vArray) {
    int vCounter = 0;
    for(int i=0;i<vArray.size(); i++)
        if(vArray.valueAt(i))
            vCounter++;
    return vCounter;

}

Cela résoudra le problème des éléments vérifiés.

1
Christoper Hans

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<size ; i++) {
     // We get the key stored at the index 'i'
     int key = checkedPositions.keyAt (i);
     // We get the boolean value with the key
     Log.i (Tag, "checkedPositions(" + key + ")=" + checkedPositions.get (key));
}
1
Idriss

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() révélera le nombre d'éléments sélectionnés

selected.get(pos) retournera true s'il est sélectionné

Comme indiqué ci-après, on effectue une itération sur tous les éléments sélectionnés:

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