Je remplace ma liste ListView
par RecyclerView
, indiquant ok, mais j'aimerais savoir comment obtenir l'élément cliqué et sa position, similaire à la méthode que OnItemClickListener.onItemClick(AdapterView parent, View v, int position, long id)
nous utilisons dans ListView
.
Merci pour les idées!
Réponses:
Basé sur le lien: Pourquoi RecyclerView n'a-t-il pas onItemClickListener ()? et En quoi RecyclerView est-il différent de Listview? , et aussi l'idée générale de @ Duncan, je donne ma solution ici:
Définissez une interface
RecyclerViewClickListener
pour transmettre le message de l'adaptateur àActivity
/Fragment
:Dans
Activity
/Fragment
implémentez l'interface et transmettez également l'écouteur à l'adaptateur:Dans
Adapter
etViewHolder
:Après le test, cela fonctionne bien.
[ MISE À JOUR ]
Depuis l'API 22,
RecyclerView.ViewHoler.getPosition()
est obsolète, donc à la place avecgetLayoutPosition()
.la source
private static RecyclerViewClickListener itemListener;
de manière statique dans le constructeur.onBindViewHolder
. De plus, mon élément de liste n'était pas entièrement cliquable (seulement une partie de l'élément).new MyRecyclerViewAdapter(context, this)
? Cela pourrait provoquer des fuites de mémoirepublic void recyclerViewListClicked(View v, int position);
Le modificateurpublic
est redondant pour les méthodes d'interfacela source
Voici un exemple pour définir un écouteur de clic.
la source
int position = getAdapterPosition();
Placez ce code là où vous définissez la vue recycleur en activité.
Ensuite, créez une classe séparée et mettez ce code:
la source
créer un fichier java avec le code ci-dessous
et utilisez simplement l'écouteur sur votre objet RecyclerView.
la source
RecyclerItemClickListener
n'est pas une classe Android par défaut, vous devez fournir la bibliothèque que vous utilisez ou la classe elle-même.Si vous voulez cliquer sur l'événement de recycle-View de l'activité / fragment au lieu de l'adaptateur, vous pouvez également utiliser le raccourci suivant.
Vous pouvez également utiliser d'autres méthodes longues comme l'utilisation de l'interface
la source
la source
Utilisez le code ci-dessous: -
la source
RecyclerView ne fournit pas une telle méthode.
Pour gérer les événements de clic sur RecyclerView, j'ai fini par implémenter onClickListener dans mon adaptateur, lors de la liaison du ViewHolder: Dans mon ViewHolder, je garde une référence à la vue racine (comme vous pouvez le faire avec vos ImageViews, TextViews, etc ...) et lors de la liaison le viewHolder J'ai mis une balise dessus avec des informations dont j'ai besoin pour gérer le clic (comme la position) et un écouteur de clics
la source
J'ai également rencontré le même problème.
Je voulais trouver la position de l'élément cliqué / sélectionné du RecyclerView () et effectuer des opérations spécifiques sur cet élément particulier.
La méthode getAdapterPosition () fonctionne comme un charme pour ce genre de choses. J'ai trouvé cette méthode après une journée de longues recherches et après avoir essayé de nombreuses autres méthodes.
Vous n'avez pas besoin d'utiliser de méthode supplémentaire. Créez simplement une variable globale nommée 'position' et initialisez-la avec getAdapterPosition () dans l'une des principales méthodes de l'adaptateur (classe ou similaire).
Voici une brève documentation à partir de ce lien .
Heureux d'aider. N'hésitez pas à poser des doutes.
la source
Ma solution simple
Positionnez ou mettez simplement les données dont vous avez besoin à partir de l'activité.
Constructeur d'adaptateur:
En activité:
Dans Adapter onClickLictener dans l'élément
dans onBindViewHolder
Maintenant, chaque fois que vous changez de position dans RecyclerView, il est conservé dans le Holder (ou peut-être devrait-il être appelé Listener)
J'espère que ce sera utile
Mon premier message; P
la source
la source
Essayez de cette façon
Classe d'adaptateur:
}
Dans votre activité ou fragment:
Remarque: implémentez OnItemClickListener en fonction du contexte que vous avez donné dans les méthodes d'activité ou de fragment et de remplacement.
la source
Chaque fois que j'utilise une autre approche. Les gens semblent stocker ou obtenir une position sur une vue, plutôt que de stocker une référence à un objet affiché par ViewHolder.
J'utilise cette approche à la place, et je la stocke simplement dans ViewHolder lorsque onBindViewHolder () est appelé, et définit la référence sur null dans onViewRecycled ().
Chaque fois que ViewHolder devient invisible, il est recyclé. Cela n'affecte donc pas la consommation de mémoire importante.
la source
L'extension courte pour la méthode Kotlin
renvoie la position absolue de tous les éléments (pas la position des seuls éléments visibles).
Et utilisation
la source
Utilisez getLayoutPosition () dans votre méthode java d'interface personnalisée. Cela renverra la position sélectionnée d'un élément, vérifiez tous les détails sur
https://becody.com/get-clicked-item-and-its-position-in-recyclerview/
la source
Depuis le concepteur, vous pouvez définir la
onClick
propriété de listItem sur une méthode définie avec un seul paramètre. J'ai un exemple de méthode défini ci-dessous. La méthode getAdapterPosition vous donnera l'index du listItem sélectionné.Pour plus d'informations sur la configuration d'un RecyclerView, consultez la documentation ici: https://developer.android.com/guide/topics/ui/layout/recyclerview
la source
la source
Après de nombreux essais et erreurs, j'ai trouvé qu'il existe un moyen très simple de le faire, c'est-à-dire en créant une interface dans la classe d'adaptateur et en l'implémentant en fragment, voici maintenant la torsion, j'ai instansi le modèle de vue à l'intérieur de ma fonction de remplacement présente dans le fragment maintenant, vous pouvez envoyer les données de cette fonction à viemodel et de là n'importe où.
Je ne sais pas si cette méthode est une bonne méthode de codage, mais veuillez me le faire savoir en commentaire et si quelqu'un veut voir le faites-le moi savoir dans la section des commentaires, j'ouvre régulièrement le flux de stackover.
la source
Si vous utilisez Kotlin
la source
Dans onViewHolder, définissez onClickListiner sur n'importe quelle vue et cliquez sur le côté pour utiliser ce code:
Toast.makeText (Drawer_bar.this, "position" + position, Toast.LENGTH_SHORT) .show ();
Remplacez
Drawer_Bar
par le nom de votre activité.la source