Comment obtenir les éléments sélectionnés à partir de la liste de sélection Multi

j'utilise un adaptateur de tableau et à cela j'ajoute un tableau de liste de chaîne s, la liste est multi select , Comment puis-je obtenir les valeurs des éléments de liste cliqué ?

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'ai essayé de faire cela ,

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 un tableau de la liste , comment faire pour récupérer les éléments sélectionnés ?

44
demandé sur Shereef Marzouk 2011-01-04 08:15:32

12 réponses

SparseBooleanArray.get returns un booléen, mais je crois 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 */
 }
43
répondu Daren Robbins 2011-01-04 05:25:24

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)) {
        Tag tag = (Tag) tags.getItemAtPosition(checked.keyAt(i));
        Log.i("xxxx", i + " " + tag);
    }
}
43
répondu Roger Keays 2018-01-07 17:19:04

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 fonctionne pas dans tous les cas). ListView saisir une paire (index, true) dans le SparseBooleanArray pour chaque indice sélectionné.

Donc 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);
}
17
répondu Karl 2012-09-24 22:00:32

je pense que la réponse de Daren Robbins est fausse, 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)));
}

Supposer id est une liste de tableaux avec la même taille de la liste contenant les id des éléments dans la vue de liste

4
répondu Shereef Marzouk 2013-05-01 15:28:23

La chose est que vous devez itérer tous les éléments de vue de liste mais pas checkedPositions.

Définir les variables:

  • listView (l'instance de votre ListView)
  • noms (ArrayList )
  • saveCheckedName (enregistrer tous vérifié nom à cette liste de tableaux)

     SparseBooleanArray checkedPositions = listView.getCheckedItemPositions();
        for (int i = 0; i < subjectListView.getCount(); i++) {
                        if (checkedPositions.get(i) == true) {
                            saveCheckedName.add(names.get(i));
                        }
                    }
    
3
répondu Yiding 2013-03-09 06:19:27

Comme beaucoup d'autres choses, multi-sélectionner s sont un vrai problème chez Android.

au lieu de simplement demander les éléments sélectionnés comme un ListObjects (cher Google, c'est ce que nous attendons):

List selected_items = my_list_view.getSelectedItems();

nous sommes obligés d'utiliser ce stupendously ridicule API:

SparseBooleanArray checked = my_list_view.getCheckedItemPositions();
    int num_selected = 0;
    for(int i = 0; i < checked.size(); i++) {
        if(checked.valueAt(i)) {
            num_selected++;
            int key = checked.keyAt(i);
            boolean value = checked.get(key);
            if (value) {
                //
            }
        }
    }

L'horreur nommé SparseBooleanArray est peuplé en appelant le encore plus horriblement nommé getCheckedItemPositions() sur le ListView. Mais au lieu de rendre les positions de chaque sélectionné/élément coché dans la liste, il renvoie la position de chaque élément de la liste a déjà été touché, qu'il soit actuellement sélectionné ou non! Incroyable, mais vrai.

pour calculer si l'article est actuellement vérifié, nous sommes forcés de tester valueAt(i) pour la véracité tout en bouclant à travers le tableau "a été jamais touché" des articles.

En plus de cette folie, si nous voulons calculer le nombre d'éléments sélectionnés, nous semblent être forcé d'augmenter notre propre compteur (par exemple,num_selected).

avec des API comme celle-ci, il n'est pas étonnant que les développeurs soient en colère!

3
répondu rmirabelle 2016-01-26 17:15:48

comment J'ai résolu le problème avec un second ArrayList :

  1. création d'une deuxième liste de tableaux exemple
  2. mise à Jour de cette liste de tableaux, par exemple avec la DÉCOCHÉ les éléments
  3. l'a ajouté à mon listadapter

    public void removeSelectedItems(){
    
    updatedList = new ArrayList<String>(); //initialize the second ArrayList
    
    int count = lv.getCount();  //number of my ListView items
    SparseBooleanArray checkedItemPositions = getListView().getCheckedItemPositions();
    for (int i=0;i < count;i++){
        if(!checkedItemPositions.get(i))
    
        updatedList.add(liveNames.get(i)); //liveNames is the current ArrayList     
        Log.e("TEST", liveNames.get(i));
    }
    
    adapter = new ArrayAdapter<String>(this,
            android.R.layout.simple_list_item_multiple_choice, updatedList);
    
    setListAdapter(adapter);}
    

Espérons qu'il sera utile :)

1
répondu CicPot 2013-02-10 12:58:12
Foo objectAtCheckedRow = null;
for (int i = 0; i < positions.size(); i++) { //positions.size() == 2
    objectAtCheckedRow = adapter.getItem(positions.keyAt(i));
    //Do something significant with object here
}

Un couple de choses à comprendre

  • c'est une liste de paires de valeurs clés.
  • est l'index d'une rangée, obtenez-le avec les positions.keyAt(i)
  • valeur est si la ligne à cet index est cochée ou non(vrai ou faux), obtenez-la avec les positions.valueAt (i)
  • postes.get(i) retourne même booléen .valueAt (i)
  • attention de ne pas confondre les index. Vous le faire pas besoin de(et ne devrait pas) itérer sur l'ensemble de votre liste. Utilisez int i pour itérer sur les positions, mais n'utilisez pas i pour obtenir des objets de votre liste
  • Mais dans ce cas précis(listView.getCheckedPositions ()) ne remplit que true (checked rows), donc vous n'avez pas besoin de vérifier en utilisant .get(i) ni le .valueAt (i)

Exemple: Disons que vous avez coché les 5e et 8e éléments de la liste(index 4 et 7), puis les positions.size() == 2 et je vais être 0 et alors 1

Donc quand:

i = = 0 alors keyAt (i) = = 4

i = = 1 alors keyAt (i) = = 7

i == 0 OU i == 1 alors valueAt(i) == true ET get(i) == true

1
répondu Kevin Worth 2013-05-24 06:00:23

Extrait de:http://mytracks.googlecode.com/hg/MyTracks/src/com/google/android/apps/mytracks/util/Api11Adapter.java

/**
* Gets the checked positions in a list view.
* 
* @param list the list view
*/
private int[] getCheckedPositions(ListView list) {
    SparseBooleanArray positions  = list.getCheckedItemPositions();
    ArrayList<Integer> arrayList = new ArrayList<Integer>();
    for (int i = 0; i < positions.size(); i++) {
        int key = positions.keyAt(i);
        if (positions.valueAt(i)) {
            arrayList.add(key);
        }
    }
    int[] result = new int[arrayList.size()];
    for (int i = 0; i < arrayList.size(); i++) {
        result[i] = arrayList.get(i);
    }
    return result;
}

et voici ma version adaptée:

public static List<Integer> getAbsListViewCheckedItemPositions(AbsListView absListView) {
    SparseBooleanArray checked  = absListView.getCheckedItemPositions();
    List<Integer> positions = new ArrayList<>();
    int checkedSize = checked.size();
    for (int i = 0; i < checkedSize; i++) {
        if (checked.valueAt(i)) {
            positions.add(checked.keyAt(i));
        }
    }
    return positions;
}
1
répondu Dreaming in Code 2015-01-30 08:11:52

nous l'utilisons dans notre classe Android utility. Les génériques aident à prévenir les avertissements de compilateurs, mais vous pouvez les supprimer si votre adaptateur renvoie plusieurs types.

public static <T> Collection<T> getCheckedItems(ListView listView) {
        Collection<T> ret = new ArrayList();
        SparseBooleanArray checkedItemPositions = listView.getCheckedItemPositions();
        for (int i = 0; i < checkedItemPositions.size(); i++) {
            if (checkedItemPositions.valueAt(i)) {
                T item = (T) listView.getAdapter().getItem(checkedItemPositions.keyAt(i));
                ret.add(item);
            }
        }
        return ret;
}
1
répondu Steven Spungin 2016-08-20 15:17:33

Très simple, utilisez code ci-dessous

listViewRequests.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                    AppCompatCheckedTextView checkBox = (AppCompatCheckedTextView) view;

                    if (checkBox.isChecked() == true){
                        Log.i("CHECK",checkBox.isChecked()+""+checkBox.getText().toString());
                    }
                }
            });
1
répondu Girish Kumar Shakya 2017-08-28 06:19:44

je pense qu'une autre option est de garder une trace de tout cela vous-même.

    list.setOnItemClickListener(new OnItemClickListener() {
        public void onItemClick(AdapterView<?> listView, View selectedItem,
                int position, long itemId) {
            //Keep a reference here, and toggle a global variable.
0
répondu chug2k 2012-04-23 08:05:00