1

J'ai une liste/des lignes de cases à cocher dans la vue de recyclage. Dans mon cas, l'utilisateur ne peut sélectionner que 3 cases sur plusieurs. Dès que l'utilisateur sélectionne la troisième case à cocher, je veux désactiver le reste des cases dans différentes lignes.Comment désactiver les cases à cocher dans recyclerview android

Je capture les cases à cocher de sélection/désélection à l'intérieur de la classe adapter. Pour autant que je sache, je peux activer/désactiver les cases à cocher dans la classe onBindViewHolder.

Mais dans mon cas, je veux activer/désactiver les cases à cocher, une fois qu'elles ont été rendues.

L'une des approches que je peux penser est, d'appeler notifyDataSetChanged(); à partir de la classe d'activité, puis de rediffuser toute la vue recyclée.

Mais j'espère que le meilleur moyen est de le faire, à l'intérieur même de la classe de l'adaptateur.

ps: Je suis nouveau sur android/java.

Répondre

0

notifyDataSetChanged() fonctionnera sans problème dans votre cas.

Veuillez noter que vous n'avez pas besoin d'appeler cette méthode depuis l'activité. Vous pouvez l'appeler en interne dans votre adaptateur après la sélection de la troisième case. Du haut de ma tête, une façon de le faire serait de stocker les positions "vérifiées" à l'intérieur d'un tableau dans l'adaptateur, puis à onBindViewHolder() vérifier si la position actuelle doit être activée ou désactivée.

0

Dans votre classe de modèle, vous pouvez avoir une variable booléenne qui décide si l'élément doit être activé ou non et une autre variable booléenne pour garder la trace de l'état vérifié, ou si l'élément est coché ou non. Dans onBindViewHolder vérifier la variable pour activer ou désactiver l'élément. Gardez la trace des éléments sélectionnés, puis après chaque cocher et décocher, vérifiez si les éléments sélectionnés dépassent la limite. Parcourez ensuite vos articles, puis vérifiez si l'article est coché ou non. si l'élément est pas checked la valeur false et après la boucle envoyer un notifyDataSetChanged() et onBindViewHolder() chèque de la valeur et activer ou désactiver l'élément/case

0

Vous pouvez utiliser SparseBooleanArray pour enregistrer tous les changements pour chaque élément en fonction sur leurs positions.

Vous pouvez utiliser la méthode suivante dans adaptateur RecyclerView:

notifyItemInserted(int) 
notifyItemRemoved(int) 
notifyItemRangeChanged(int, int) 
notifyItemRangeInserted(int, int) 
notifyItemRangeRemoved(int, int) 

En savoir plus à RecyclerView.Adapter.

N'utilisez que notifyDataSetChanged() en dernier recours. Car l'appel de notifyDataSetChanged() forcera les vues à se reconnecter et à se relancer. Comme dans le documentation dit:

notifyDataSetChanged void()

tous les observateurs enregistrés notifier que l'ensemble de données a changé.

Il existe deux classes différentes d'événements de modification de données, les modifications d'élément et les modifications structurelles.Les modifications d'élément sont lorsqu'un élément a ses données mises à jour mais aucun changement de position n'est survenu. Les modifications structurelles concernent les éléments insérés, supprimés ou déplacés dans l'ensemble de données . Cet événement ne spécifie pas ce qui concerne l'ensemble de données a changé, obligeant les observateurs à supposer que tous les éléments existants et la structure peuvent ne plus être valide. LayoutManagers sera obligé de relier entièrement et de relancer toutes les vues visibles. RecyclerView tentera de synthétiser les événements de modification structurelle visible pour les adaptateurs qui indiquent qu'ils ont des ID stables lorsque cette méthode est utilisée. Cela peut aider à des fins d'animation et de persistance d'objets visuels, mais les vues d'éléments individuels devront toujours être rebond et relancées.

Si vous écrivez un adaptateur, il sera toujours plus efficace d'utiliser si vous le pouvez. S'appuyer sur notifyDataSetChanged() en dernier recours.