41 votes

La sélection ListView reste persistante après la sortie du mode choix

J'ai une ListView sous-classe que j'permettre des sélections sur lorsque le contexte de la barre d'action (ACR) est active. La CABINE est défini comme un rappel à la onItemLongClick événement:

public boolean onCreateActionMode(ActionMode mode, Menu menu) {
    // Inflate a menu resource providing context menu items
    MenuInflater inflater = mode.getMenuInflater();
    inflater.inflate(context_menu, menu);
    getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE);
    return true;
}

C'est très bien, et la liste fonctionne comme prévu, avec l'élément actuellement sélectionné rester en surbrillance quand on les touche.

Quand je ferme la CABINE, je veux la liste pour revenir à la normale (c'est à dire en mode Tactile). Le problème est que le dernier élément sélectionné reste en surbrillance indéfiniment, indépendamment de ce que les méthodes que j'essaie de l'effacer:

    public void onDestroyActionMode(ActionMode mode) {
    //Unselect any rows
    ListView lv = getListView();
    lv.clearChoices(); // Has no effect
    lv.setChoiceMode(ListView.CHOICE_MODE_NONE); // Has no effect on the highlighted item 
    lv.setFocusable(false); // Has no effect
    lv.setSelection(0); // Has no effect
    mActionMode = null;
}

Toutes les suggestions?

34voto

Rudi Points 346

La principale raison pour laquelle le problème est qu'une fois l' ListView le mode de sélection est allumé à l' CHOICE_MODE_NONE, le cadre optimise le clair de l'opération, car il n'est plus le soutien de sélection'. J'ai amélioré les solutions ci-dessus un peu par la compensation de l'état de sélection manuelle, puis réglage de la mode en un retard de manière de sorte que le cadre de son tour pour libérer l'état avant d'activer le mode d' CHOICE_MODE_NONE.

final ListView lv = getListView();
lv.clearChoices();
for (int i = 0; i < lv.getCount(); i++)
    lv.setItemChecked(i, false);
lv.post(new Runnable() {
    @Override
    public void run() {
        lv.setChoiceMode(ListView.CHOICE_MODE_NONE);
    }
});

20voto

Knickedi Points 5881

J'ai connu le même problème et depuis demandant la mise en page n'est pas de résoudre le problème pour moi non plus j'avais mis en place un petit hack qui fonctionne pour moi. C'est peut-être la même question parce que je suis passer entre CHOICE_MODE_SINGLE et CHOICE_MODE_NONE.

Lorsque le mode d'action se termine, je vais appeler cet extrait de code. clearChoices permet de s'assurer que tous les éléments ne sont pas vérifiées plus (en interne). L'itération sur les points de vue permet de s'assurer que toutes les vues visibles sont remis à zéro et de ne pas cochée plus.

mListView.clearChoices();

for (int i = 0; i < mListView.getChildCount(); i++) {
    ((Checkable) mListView.getChildAt(i)).setChecked(false);
}

mListView.setChoiceMode(ListView.CHOICE_MODE_NONE);

18voto

Migaloo Points 91

En regardant le code source ListView, le seul moyen de contourner ce problème consiste à définir ListView sur CHOICE_MODE_NONE, puis à réaffecter le ListAdapter (qui efface la liste de sélection interne quel que soit le mode de choix).

c'est-à-dire dans un ListFragment / ListActivity

 getListView().setChoiceMode(ListView.CHOICE_MODE_NONE);
getListView().setAdapter(getListAdapter())
 

4voto

jpmcosta Points 143

J'avais ce problème en API Level 17 et je l'ai résolu en faisant:

 listView.clearChoices();
listView.invalidateViews();
 

2voto

darktiny Points 1

Pour moi, il semble que l'on a accepté la réponse n'est pas de travail pour les éléments invisibles, et il n'est pas besoin de faire appel

for (int i = 0; i < lv.getCount(); i++)
        lv.setItemChecked(i, false);

au lieu de cela, il suffit d'appeler

lv.requestLayout();

Complètement résoudre mon problème, je l'appelle

lv.clearChoices();
lv.requestLayout();

en onDestroyActionMode()

et appel

lv.setItemChecked(position, false)

en onItemClick() quand il n'est pas ActionMode

Cependant, je n'ai pas confirmer si la fonction d'appel setItemChecked() va entraîner des problèmes de performances

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X