Il n'y a pas de prise en charge intégrée pour un "choix" mode de structure avec RecyclerView. Vos options sont soit de rouler vous-même ou utiliser une bibliothèque tierce, qui l'offre.
Le DynamicRecyclerView bibliothèque offre un choix de modes, mais je ne l'ai pas essayé.
Cet exemple d'application illustre l'implémentation de vous-même, dans ce cas, l'aide de l'état activé pour indiquer qui est le choix actuel. Le schéma global est:
Votre RecyclerView.ViewHolder détecter une INTERFACE utilisateur fonctionnement que indique un choix (cliquez sur une ligne? cliquez sur un RadioButton dans la ligne? etc.).
Garder une trace de la sélection au niveau de votre RecyclerView.Adapter. Dans mon cas, un ChoiceCapableAdapter poignées qui, en conjonction avec un SingleChoiceMode classe qui implémente une ChoiceMode stratégie.
Lorsqu'un choix est fait, mettez à jour le nouvellement choisie pour refléter le choix et mise à jour précédemment choisie pour refléter le fait que ce n'est plus choisi. findViewHolderForPosition() sur RecyclerView peut aider à ici-si vous suivez le position du dernier choix, findViewHolderForPosition() peut vous donner le ViewHolder de ce choix, de sorte que vous pouvez les nations unies "-choisissez" il.
Garder une trace du choix à travers les modifications de la configuration, en le mettant dans l'enregistrés l'état de l'instance de l'activité ou du fragment de la gestion de la RecyclerView.
Hey, cette solution semble assez bon, mais findViewHolderForPosition() est maintenant obsolète. Que peut-on utiliser à la place?
Mon instinct me dit ce qui doit changer à findViewHolderForAdapterPosition(), comme ce qui semble être un peu plus conservateur que findViewHolderForLayoutPosition(). Le désormais obsolète findViewHolderForPosition() en fait a le même comportement que findViewHolderForLayoutPosition(), de sorte que celui-ci travaille, mais il ne prendra pas en compte les données de vol, les changements de.
Hm semble que les deux findViewHolderForAdapterPosition() et findViewHolderForLayoutPosition() ont le même effet dans votre exemple d'application qui fonctionne très bien mais je ne comprends pas la différence entre eux
Eh bien, d'après les docs, findViewHolderForAdapterPosition() sera de retour null si il est un remarquable notifyDataSetChanged() d'appel qui n'a pas encore été appliquée. findViewHolderForLayoutPosition() travaille uniquement hors du réel visible enfants de la RelativeLayout. Donc, pour mon exemple, il n'y a probablement pas de différence nette.
Cool merci je pense que je vais aller avec le findViewHolderForLayoutPosition() dans mon cas, cause j'ai besoin d'avoir un article retourné, à chaque fois, peu importe si notifyDataSetChanged() a été appliqué ou non
Malheureusement je ne parvenais pas à le faire fonctionner dans mon application. Je vais ouvrir une nouvelle question fil et essayer d'expliquer exactement ce dont j'ai besoin
quelqu'un pourrait-il poster les dépendances nécessaires à la compilation de la bibliothèque pour "DynamicRecyclerView"
j'ai été en mesure d'utiliser votre projet de démonstration, mais je suis en manque une fonctionnalité que par mon exigence qui est si je veux faire un premier élément sélectionné au départ. comment le faire fonctionner?
Sans doute, appelez onChecked(0, true) dans onCreate() après la création de la carte. Si vous avez d'autres préoccupations, veuillez demander une Pile séparée de Débordement de la question.
J'avais fait la même chose. Parlant de la bibliothèque de prise en charge, je trouve vraiment déroutant que le LayoutManager obtient une chance de sauver son état, tandis que l'Adaptateur ne fonctionne pas. Il est logique sur le plan conceptuel, mais ensuite, il y a de jolies choses en commun (comme ceci) qui 1. Peut manifestement pas être gérées à partir d'un LayoutManager, et 2. Sont dépendant de l'état.
Il n'y a pas de prise en charge intégrée pour un "choix" mode de structure avec
RecyclerView
. Vos options sont soit de rouler vous-même ou utiliser une bibliothèque tierce, qui l'offre.Le DynamicRecyclerView bibliothèque offre un choix de modes, mais je ne l'ai pas essayé.
Cet exemple d'application illustre l'implémentation de vous-même, dans ce cas, l'aide de l'état activé pour indiquer qui est le choix actuel. Le schéma global est:
Votre
RecyclerView.ViewHolder
détecter une INTERFACE utilisateur fonctionnement que indique un choix (cliquez sur une ligne? cliquez sur unRadioButton
dans la ligne? etc.).Garder une trace de la sélection au niveau de votre
RecyclerView.Adapter
. Dans mon cas, unChoiceCapableAdapter
poignées qui, en conjonction avec unSingleChoiceMode
classe qui implémente uneChoiceMode
stratégie.Lorsqu'un choix est fait, mettez à jour le nouvellement choisie pour refléter le choix et mise à jour précédemment choisie pour refléter le fait que ce n'est plus choisi.
findViewHolderForPosition()
surRecyclerView
peut aider à ici-si vous suivez leposition
du dernier choix,findViewHolderForPosition()
peut vous donner leViewHolder
de ce choix, de sorte que vous pouvez les nations unies "-choisissez" il.Garder une trace du choix à travers les modifications de la configuration, en le mettant dans l'enregistrés l'état de l'instance de l'activité ou du fragment de la gestion de la
RecyclerView
.findViewHolderForAdapterPosition()
, comme ce qui semble être un peu plus conservateur quefindViewHolderForLayoutPosition()
. Le désormais obsolètefindViewHolderForPosition()
en fait a le même comportement quefindViewHolderForLayoutPosition()
, de sorte que celui-ci travaille, mais il ne prendra pas en compte les données de vol, les changements de.findViewHolderForAdapterPosition()
etfindViewHolderForLayoutPosition()
ont le même effet dans votre exemple d'application qui fonctionne très bien mais je ne comprends pas la différence entre euxfindViewHolderForAdapterPosition()
sera de retournull
si il est un remarquablenotifyDataSetChanged()
d'appel qui n'a pas encore été appliquée.findViewHolderForLayoutPosition()
travaille uniquement hors du réel visible enfants de laRelativeLayout
. Donc, pour mon exemple, il n'y a probablement pas de différence nette.findViewHolderForLayoutPosition()
dans mon cas, cause j'ai besoin d'avoir un article retourné, à chaque fois, peu importe sinotifyDataSetChanged()
a été appliqué ou nononChecked(0, true)
dansonCreate()
après la création de la carte. Si vous avez d'autres préoccupations, veuillez demander une Pile séparée de Débordement de la question.J'ai créé une bibliothèque de ce type de choix du mode appliquée à la RecyclerView, peut-être que ça peut aider:
Description
Cette bibliothèque a été créée pour aider à l'intégration de la multi-sélection pour le RecyclerView
Mise en œuvre
L'intégration avec Gradle est très facile, vous avez juste besoin de la jcenter référentiel et de la bibliothèque:
Principales étapes de l'utilisation de la
Ajouter le MultiChoiceRecyclerView à votre fichier xml
Instancier vous de l'objet et de connecter la vue
Vous prolonger l'adaptateur à la MultiChoiceAdapter et l'ajouter à la RecyclerView que par l'utilisation normale
Pour plus d'informations et de personnalisation:
https://github.com/dvdciri/MultiChoiceRecyclerView
Vous pouvez suivre ce:
– Données (String name, boolean sélectionné)
– Adaptateur avec itemClickListener
– Activité ou un fragment
– activity_main (recyclerView)
– list_item (TextView, Case à cocher)
Données
Votre point de vue activity_main.xml (recyclerView)
et list_item.xml (TextView, Case à cocher)
Adaptateur avec ClickListener
Activité ou un fragment
Vous pouvez voir cet exemple sur GitHub et ce post pour le choix multiple, et ce post pour seul choix Heureux de code!!!