2009-12-09 6 views
1

Mon scénario:
-J'utilise une vue de liste en mode de choix multiple pour permettre à un utilisateur de de supprimer plusieurs éléments qu'il/elle a vérifiés, à la fois.
-Lorsque l'utilisateur clique sur le bouton de suppression, je procède comme suit:
-get les positions des éléments cochés à l'aide de: myList.getCheckedItemPositions();
-Obtenez les objets dans cette position et placez-les dans une liste - toDeleteList.
- (QUESTION BASÉE SUR CETTE ÉTAPE) utilisez myList.setItemChecked (position, false) pour décocher l'élément de la liste.
-Retirer les éléments de la « toDeleteList »
Android liste vue clarification quest

Maintenant, j'ai été « forcé » à décocher manuellement l'élément de la liste car le résultat de myList.getCheckedItemPositions() ne change pas après la suppression de mylist .. à savoir

-si, par exemple, je supprime le 1er élément (a) de la liste [a, b, c, d], b apparaîtra vérifié après la suppression ie. dans la liste la liste [b, c, d] - après avoir supprimé a.

Question pourquoi? Parce que le SparseBooleanArray retourné par myList.getCheckedItemPositions(); est la même avant et après la suppression de la liste - en utilisant l'adaptateur.

je pensais (je peux me tromper) que, après la suppression d'un élément de la liste via l'adaptateur, le tableau CheckedItemPositions devrait également changer pour refléter le nouvel état de la liste

par exemple. - maliste = [a, b, c, d]
- puis-je consulter les articles à la position 0 et 3 vérifié (a & d)
- les positions de l'objet vérifié (mylist.getCheckedItemPositions()) réseau a des valeurs maintenant true pour les positions 0 et 3
- Si je supprime un & d de la liste, par conséquent, mylist = [b, c], mylist.getCheckedItemPositions() est toujours le même que ci-dessus ie.
- Je m'attendais à ce qu'il ne soit pas vérifié pour les positions 0 & 3 parce que les articles auparavant à ces postes ne sont plus dans la liste.

je suis quelque chose de mal ici (ou ayant le mauvais attentes :))? quelqu'un s'il vous plaît .. clarifier ce
Merci à l'avance,

Répondre

1

exprimant mon opinion personnelle, je suppose les positions resterait encore vérifié parce que le getCheckedItemPositions() reflète les positions opposées aux valeurs, donc si les positions 0 et 3 sont existent encore à l'intérieur du ListView après la suppression, ils resteront cochés.

Je peux me tromper, en exprimant ma propre opinion. Bonne chance

+0

Merci .. je vois ce que tu veux dire mais je pensais si j'utilise mylist.getCheckedItemPositions() sur la nouvelle liste, ie. avec les éléments précédemment cochés ne sont plus dans la liste (après avoir utilisé adapter.remove() ..) - le résultat devrait être vide/null car ma liste ne contient plus les éléments cochés .. - encore peut-être vous avez raison, merci – cire

+0

vous avez besoin d'appeler la méthode listView.getCheckItemIds() qui renverra les identifiants des éléments checked, et cela fonctionne pour moi, sans rien changer à cela;). la méthode getcheckedItemPositions() ne fonctionne pas :) – Houcine

2

Je luttais avec ce même problème et c'est ce qui a fonctionné pour moi.D'abord, j'ai mis un adaptateur de curseur qui maintient l'état des éléments vérifiés en fonction de leurs identifiants, puisque les positions ne sont pas utiles lorsque la liste peut être modifiée dynamiquement.

private class TagListAdapter extends SimpleCursorAdapter { 
    /** 
    * Stores boolean values for the list items, based on their ids. 
    */ 
    SparseBooleanArray mCheckStates; 

    public TagListAdapter(Context context, int layout, Cursor c, String[] from, int[] to) { 
     super(context, layout, c, from, to); 
     mCheckStates = new SparseBooleanArray(); 
    } 

    /** 
    * Sets an id as checked/unchecked. 
    * @param id 
    * @param checked 
    */ 
    public void setChecked(int id, boolean checked) { 
     mCheckStates.put(id, checked); 
    } 

    /** 
    * @see android.widget.ListAdapter#getView(int, View, ViewGroup) 
    */ 
    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View view = super.getView(position, convertView, parent); 

     if(!mCursor.moveToPosition(position)) { 
      throw new IllegalStateException("couldn't move cursor to position " + position); 
     } 

     int id = mCursor.getInt(INDEX_OF_COLUMN_ID); 
     if(mCheckStates.indexOfKey(id) < 0) { 
      // Populate checked value for the first time. 
      mCheckStates.put(id, function_that_returns_if_the_item_is_checked(id)); 
     } 

     // Set the item as checked or unchecked based on the value stored in mCheckStates. 
     mListView.setItemChecked(position, mCheckStates.get(id, false)); 
     return view; 
    } 
} 

Puis dans mon activité je me suis fixé un onListItemClick() qui exécute la vérification/l'action décocher connexes et définit l'état vérifié dans l'adaptateur:

@Override 
protected void onListItemClick(ListView l, View v, int position, long id) { 
    super.onListItemClick(l, v, position, id); 
    boolean checked = ((CheckedTextView) v).isChecked(); 

    if(checked == true) { 
     // execute uncheck related action 
     function_called_when_item_is_unchecked(id); 
    } else { 
     // execute check related action 
     function_called_when_item_is_checked(id); 
    } 

    // Check/uncheck the item in the adapter. 
    ((TagListAdapter) getListAdapter()).setChecked((int) id, !checked); 
} 
+0

Je rencontre le même problème, donc je pense que cela pourrait marcher pour moi mais j'ai 2 questions: 1. D'où mouvez-vous mListView ??? 2. pouvez-vous définir un exemple de function_that_returns_if_the_item_is_checked? –

+0

En outre, cette ligne provoque la fermeture de mon application (aucune idée de pourquoi ...): boolean checked = ((CheckedTextView) v) .isChecked(); –