2014-04-21 5 views
0

J'utilise une liste multiple dans mon application. Plus précisément, le simple_list_item_activated_1.Sélectionner/Désélectionner tous les éléments d'une liste

J'ai un peu de code, un bouton, qui va sélectionner tous les éléments listview. J'ai une logique disant que si tous les éléments sont déjà sélectionnés, désélectionnez tous les éléments.

Lorsque j'appuie sur le bouton la première fois, il sélectionne tous les éléments de la liste comme prévu. et quand j'appuie sur le bouton une deuxième fois il désélectionne tous les articles comme prévu.

Voici mon problème: Lorsque j'appuie sur le bouton une troisième fois, "selectedCount" est toujours égal à "childCount". Donc, évidemment, mon code n'entrera jamais dans l'instruction If.

Quelqu'un sait-il pourquoi cela se produit? ou peut-être il y a une meilleure façon de faire ce que j'essaye de réaliser?

int childCount = officerList.getChildCount(); 
    int selectedCount = officerList.getCheckedItemPositions().size(); 

      if(childCount != selectedCount){ 
       for (int i = 0; i < officerList.getChildCount(); i++) { 
        officerList.setItemChecked(i, true); 
       } 
      }else{ 
       for (int i = 0; i < officerList.getChildCount(); i++) { 
        officerList.setItemChecked(i, false); 
       } 
      } 
     } 

Répondre

0

J'ai réussi à répondre à ma propre question. Utiliser getCheckItemPositions(). Size() est un moyen peu fiable de réaliser ce que je veux.

Cela retournera un sparseBooleanArray() de tous les éléments cochés, donc la première fois qu'il fonctionne correctement car il n'y a rien sélectionné alors il retournera 0. Puis une fois que tout est sélectionné, sparseBooleanArray sera égal à tous les éléments dans la liste comme ils ont tous été sélectionnés.

Cependant, comme j'ai appris spareBooleanArray est un tableau qui stocke la position et un drapeau booléen de si elle est sélectionnée ou non. Dans mon scénario lorsque j'appuie sur le bouton Sélectionner tout pour le troisième, la taille du tableau est toujours égale au nombre d'éléments de la liste. Comment j'ai résolu mon problème, est d'utiliser getCheckedItemCount() qui ne renvoie que le nombre d'éléments sélectionnés comme je le voulais initialement. J'espère que cette réponse aidera quelqu'un d'autre.

int childCount = officerList.getChildCount(); 
int selectedCount = officerList.getCheckedItemCount(); 

     if(childCount != selectedCount){ 
      for (int i = 0; i < officerList.getChildCount(); i++) { 
       officerList.setItemChecked(i, true); 
      } 
     }else{ 
      for (int i = 0; i < officerList.getChildCount(); i++) { 
       officerList.setItemChecked(i, false); 
      } 
     } 
    } 
0

Essayez cette logique, il vérifiera tous les éléments si aucun des articles sont vérifiés, sinon vérifiera uniquement les éléments qui ne sont pas cochée et vice-versa.

public void onClick(View v) { 
     SparseBooleanArray sparseBooleanArray = officerList.getCheckedItemPositions(); 
     if(sparseBooleanArray != null && sparseBooleanArray.size() >0) { 
      for (int index = 0; index < sparseBooleanArray.size(); index++) { 
       if(sparseBooleanArray.valueAt(index)){ 
         officerList.setItemChecked(sparseBooleanArray.keyAt(index),true); 
        } 
        else { 
         officerList.setItemChecked(sparseBooleanArray.keyAt(index),false); 
        } 
       } 
      } 
      else { 
       for (int index = 0; index < officerList.getCount(); index++) { 
        officerList.setItemChecked(index,true); 
       } 
      } 
     } 
Questions connexes