49 votes

ListView réutilisant les vues quand... je ne veux pas

J'ai un ListView , dont chacun des item contient un ToggleButton . Après l'avoir basculé puis fait défiler vers le haut ou vers le bas, le ListView recycle les vues et donc certains des autres reflètent l'état vérifié du ToggleButton . Je ne veux pas de ça. Comment puis-je l'empêcher?

87voto

Lilo Points 337

Ajoutez ces deux méthodes à votre adaptateur.

 @Override

public int getViewTypeCount() {                 

    return getCount();
}

@Override
public int getItemViewType(int position) {

    return position;
}

3voto

Jan Ziesse Points 21

Vous pouvez utiliser un HashMap pour enregistrer l'état de vos boutons :

  private Map<Integer,Boolean> listMapBoolean = new HashMap<Integer,Boolean>();


 toggleButton.setOnCheckedChangeListener(new OnCheckedChangeListener() {
                    @Override
                    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                        if (isChecked) {
                            listMapBoolean.put(position, true);
                        } else {
                            listMapBoolean.put(position, false);
                        }
                    }
                });

et après avoir gonflé la vue, vous lisez le HashMap pour voir s'il a été coché ou non :

  for (Entry<Integer, Boolean> entry : listMapBoolean.entrySet()) {
                if (entry.getKey().equals(i)) {
                    if(entry.getValue()) {
                        System.out.println("ToggleButton is checked!");
                    } else {
                        System.out.println("ToggleButton is not checked!");
                    }
                }
            }

Je ne sais pas si cela vous aide. J'ai également eu des problèmes avec le recyclage de mon EditText dans mon ListView .

0voto

Gaurav Points 569

Autant que je sache, Android réutilise les composants. Lorsque vous faites défiler la liste vers le haut et vers le bas, elle est actualisée et vos composants sont à nouveau créés. Pour enregistrer l'état du bouton bascule, vous devrez maintenir son état par programmation.

Pouvez-vous envoyer votre code?

0voto

Samuel Robert Points 2755

Vous devriez peut-être essayer de créer votre propre vue de liste avec une vue de défilement et un conteneur qui contient les enfants qui sont ajoutés au conteneur par programmation. définissez la balise pour identifier l'enfant ou vous pouvez utiliser l'ordre de l'enfant pour cela

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