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> 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);
}
}
3 Réponses :
Le problème est dû au fait que ListView recycle des vues informatiques
donc dans 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. P> P> GeView ( code>) p>
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();
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 puis sur votre getView, la case à cocher SETONCHECKEDCHANGEDLANGEDLANDLANGED doit préciser votre case à cocher. P> Exemple: P> getcount () code>. P>
holder.checkBox.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
isChecked[position] = isChecked;
}
});
holder.checkBox.setChecked(isChecked[position]);
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 code>
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.