7
votes

Case à cocher ListView Viewholder State

J'ai des problèmes avec mon adaptateur personnalisé ListView (et son propriétaire nouvellement mis en œuvre). J'ai une liste de réception avec une case à cocher pour chaque article (rien de nouveau ici). Le problème est que s'il y a plus de 9 éléments dans ma liste, lorsque je vérifie la première case à cocher, le dixième sera automatiquement vérifié (identique pour la seconde avec le onzième) comme s'il y avait un auditeur pour les deux éléments (et je croire que c'est le cas d'une certaine manière).

J'ai lu sur la question de la position avec ListView, affichez le recyclage et la manière de la vue pour résoudre ici: Comment puis-je faire mon arrayadapter suivre le modèle de vue du point de vue? p>

mais j'ai probablement fait quelque chose de mal parce que ça ne fonctionne pas ... P> xxx pré>

et mon auditeur: Public Void ChangerPresent (View V) { P>

    CheckBox checkPresent = (CheckBox) v;
    int idPersonne = (Integer) checkPresent.getTag();
    View parent = (View)v.getParent();
    Button btn = (Button) parent.findViewById(R.id.btnRetard);

    if(checkPresent.isChecked()) {
        gestion.updatePresence(idPersonne, idSeance, "P");

        btn.setEnabled(true);
        setBtnRetardPresent(btn);           
    }
    else 
    {
        gestion.updatePresence(idPersonne, idSeance, "A");
        btn.setEnabled(false);
        setBtnRetardAbsent(btn);

    }

}


0 commentaires

3 Réponses :


0
votes

Le problème est dû au fait que ListView recycle des vues informatiques

donc dans GeView () xxx

Vous devez écrire Le code pour gérer l'état de vue si la convertie n'est pas nulle, car il s'agit d'une vue déjà utilisée pouvant avoir des cases à cocher vérifiées.


0 commentaires

0
votes

Vous devez définir l'état de la vérification de l'ordre à l'extérieur de l'initialisation du porte-vision, comme le code suivant:

if (convertView == null) {
    viewHolder = new ViewHolder();
    convertView.setTag(viewHolder);
} else {
    viewHolder = (ViewHolder) convertView.getTag();
}

viewHolder.checkedBox.setChecked();


0 commentaires

14
votes

Voici comment je l'ai fait fonctionner:

Premièrement, vous avez besoin d'une matrice séparée pour votre état vérifié. Il doit avoir la même taille que celui de votre adaptateur getcount () code>. P>

puis sur votre getView, la case à cocher SETONCHECKEDCHANGEDLANGEDLANDLANGED doit préciser votre case à cocher. P>

Exemple: P>

holder.checkBox.setOnCheckedChangeListener(new OnCheckedChangeListener() {
  @Override
  public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
    isChecked[position] = isChecked;
  }
});

holder.checkBox.setChecked(isChecked[position]);


13 commentaires

Parfait ! Merci pour vos explications.


Intéressant, pouvez-vous s'il vous plaît savoir pourquoi checkchangelistener doit précéder SetChecked? Merci


Si vous avez d'autres choses que vous souhaitez faire dans l'ONCHECKCHANGED (telle que mettre à jour la couleur de la liste de la liste, etc.), ces choses ne se produiront pas si vous appelez SetChecked avant de définir l'auditeur.


Ok, je pense que je l'ai eu, SetCheckChanged est appelé dans la méthode GeveView chaque fois qu'il est recyclé (mécanisme GeveView). Pas attendu.


Je ne pouvais pas voir votre commentaire, oui cette mise à jour ne se produit pas dans l'élément de la liste. La question est pourquoi?


Parce que la logique simple dans l'ordre d'exécution. Si vous appelez SetChecké avant de définir l'écoute, l'ONCHECKCHANGED ne sera pas déclenché. (1 +1) / 2 n'a pas le même résultat que (1/2) + 1.


Des réponses comme celles-ci sur donc, tournez la vie facile :)


wtf? Comment cela peut-il avoir un effet lorsque le clic-écouteur est déclenché waaaaaaay plus tard?


@Avalancha parce que vous le déclenchez déjà lorsque vous appelez SetChecked


Ou vous pouvez définir l'auditeur surCoChecked à NULL avant d'utiliser SetChecked. L'utilisation de SetChecked déclenche également l'événement.


@InsignificantPerson qui fonctionnerait si ce n'est que la case à cocher que vous souhaitez mettre à jour. Toutefois, si vous faites autre chose (comme définissant certains TextView sur Bold lorsque la case à cocher est cochée, par exemple), c'est le moyen le plus simple de le faire.


Ne fonctionne pas pour moi, sélectionne les cases à cocher dès que de nouvelles vues générées! Tous les nouveaux conseils que vous avez peut-être essayés pour ce problème!


Lorsque je fais pivoter l'écran, toutes les cases sélectionnées sont non sélectionnées. Il redémarre la vue de la liste.