Quelqu'un a-t-il RecyclerView
trouvé un moyen de définir un onClickListener
à des éléments dans le RecyclerView
? J'ai pensé à mettre un auditeur sur chacune des mises en page pour chaque élément, mais cela semble un peu trop compliqué, je suis sûr qu'il existe un moyen RecyclerView
d'écouter l' onClick
événement, mais je ne peux pas vraiment le comprendre.
583
Réponses:
Comme les API ont radicalement changé, cela ne m'étonnerait pas que vous créiez un
OnClickListener
pour chaque élément. Ce n'est pas si compliqué que ça. Dans votre implémentation deRecyclerView.Adapter<MyViewHolder>
, vous devriez avoir:La
onClick
méthode:la source
onClick()
, appartenant àOnClickListener
peut être attaché à N'IMPORTE QUELLE vue. Toute la question ici est de savoir qui! Veuillez faire un effort, une méthode n'est pas seulement identifiée par un nom, mais aussi au moins par une classe. Si vous ne dites pas que votre code doit être ajouté à l'adaptateur, votre réponse n'aide pas vraiment.Voici une manière meilleure et moins étroitement couplée d'implémenter un
OnClickListener
pour unRecyclerView
.Extrait d'utilisation:
RecyclerItemClickListener
la mise en oeuvre:la source
Je le fais de cette manière, sans classes indues, détecteurs, etc. Code simple à l'intérieur de notre adaptateur. Solution particulièrement meilleure pour longClick qu'auparavant.
Ensuite, à l'intérieur d'un fragment ou d'une activité, appuyez simplement sur:
la source
Consultez une question similaire @ CommonsWare commente les liens vers cela , qui implémente l'
OnClickListener
interface dans leviewHolder
.Voici un exemple simple de
ViewHolder
:Le
Adapter
ressemble alors à ceci:la source
ListView
était déjà problématique si vous deviez créer une liste d'objets plus compliqués que de simples lignes. Que faire si vous devez gérer différents événements selon l'endroit où vous cliquez sur l'élément dans ListView? T'es foutu. Ici, vous avez chacun des auditeurs.getPosition()
est obsolète, utilisezgetAdapterPosition()
ou à lagetLayoutPosition()
place.Sur la base de la réponse de Jacob Tabak (+1 pour lui), j'ai pu ajouter sur l'auditeur LongClick:
Ensuite, vous pouvez l'utiliser comme ceci:
la source
public void onRequestDisallowInterceptTouchEvent (boolean disallowIntercept){}
view.getId() == R.id.selection
C'est ce qui a fonctionné pour moi. Fixez le
OnClickListener
auonBindView
. Je ne sais pas vraiment si cela aura un impact sur les performances, mais cela semble fonctionner correctement avec peu de code.la source
C'était si difficile pour moi d'avoir sur l'écouteur de clic d'élément dans l'activité et aussi d'avoir l'écouteur de clic pour une vue unique de l'élément qui ne se déclenchera pas sur l'écouteur de clic d'élément. Après avoir joué avec la réponse de Jacob Tabak, je respecte sa réponse pour le clic sur l'élément si aucune autre action tactile à l'intérieur de l'élément n'est présentée.
J'ai une
OnClickListener
interface personnalisée qui a un événement de clic sur l'élément qui contient la vue de l'élément cliqué et la position de l'élément depuis l'adaptateur. J'en présente une instance dans le constructeur (ou cela peut être avec setter) et je l'attache à l'écouteur de clic du conteneur du support de vue.J'ai également un autre écouteur de clic dans l'adaptateur (peut être dans le support de vue) qui gérera le clic de vue actuel du conteneur.
Dans l'activité, vous devez initialiser l'adaptateur en passant l'instance du
OnItemClickListener
Et mon ViewHolder
la source
C'est ce dont j'ai fini par avoir besoin, au cas où quelqu'un le trouverait utile:
Source: http://blog.csdn.net/jwzhangjie/article/details/36868515
la source
Je solution agréable pour
RecyclerView
« sonItemClickListener
pour les articles et les sous - élémentsÉtape 1- Créer une interface
Étape 2- Ensuite, utilisez-la dans la
onBindViewHolder
méthode de l'adaptateur de la manière suivanteÉtape 3: recherchez et configurez la vue du recycleur dans l'activité ou le fragment où vous l'utilisez
Étape 4 - Enfin, implémentez l'interface dans l'activité ou le fragment où vous utilisez la vue de recyclage
la source
Voici ce que j'ai fait. Cette solution prend en charge à la fois onClick et onLongClick sur les éléments RecyclerView et les vues à l'intérieur des éléments RecyclerView (vues internes).
Je marque viewHolder sur les vues de mon choix:
Et j'utilise holder.getPosition () pour récupérer la position dans la méthode onClick () (onLongClick est similaire):
Une variante avec getChildPosition fonctionne également. Veuillez noter que pour les vues internes, dans onClick (), utilisez:
À mon avis, l'avantage de cette solution est que lorsque l'on clique sur l'image, seul l'écouteur d'image onclick () est appelé alors que lorsque j'ai combiné la solution de Jacob pour une vue d'élément RecyclerView et ma solution pour les vues internes, la vue d'élément RecyclerView onclick ( ) est également appelé (lorsque vous cliquez sur l'image).
la source
Il existe un moyen beaucoup plus simple de procéder. Il suffit d'appliquer en cliquant
onBindViewHolder
sur la vue racine.Considérez que c'est votre point de vue pour l'adaptateur,
Ensuite, procédez comme suit dans votre adaptateur
la source
Vous pouvez passer un
clickListener
àAdapter
.Dans votre
Activity
:puis passez-le à
Adapter
:Dans
Adapter
« sonCreateViewHolder
:la source
holder
valeurs par intention?J'ai développé une bibliothèque légère pour Android, vous pouvez visiter https://github.com/ChathuraHettiarachchi/RecycleClick
et suivez pour l'échantillon suivant
la source
Vous pouvez implémenter OnClickListener à votre classe ViewHolder
Et onBindViewHolder définit l'élément de votre porte-vue
la source
Trop simple et efficace.
Au lieu d'implémenter l'interface
View.OnClickListener
dans le support de vue ou de créer et d'interfacer et d'implémenter l'interface dans votre activité - j'ai utilisé ce code pour uneOnClickListener
implémentation simple .la source
Toutes les réponses publiées jusqu'à présent sont d'excellentes solutions, mais si vous ne voulez pas traiter trop de détails d'implémentation et que cela fonctionne simplement de la même manière que ListView, je recommanderais d'utiliser TwoWay-View, comme on le voit ici:
https://github.com/lucasr/twoway-view
Notez que cette implémentation prend également en charge la pression longue sur les éléments, ainsi que la prise en charge des états pressés (ce qui est quelque chose d'important que les autres solutions à cette question manquent).
Si vous ne souhaitez pas utiliser la bibliothèque entière, jetez un œil à la classe ClickItemTouchListener , qui peut être utilisée de manière autonome si nécessaire. Le seul problème que j'ai trouvé en ce moment est avec un appui long + défilement, il semble avoir un comportement incorrect.
la source
Si vous souhaitez intercepter l'événement Click sur des éléments individuels, implémentez simplement
OnClickListener
enViewHolder
classe, puis définissez les écouteurs de clic sur des vues individuelles ou dans leur ensembleitemView
.L'exemple suivant montre la même chose
la source
Pour moi, c'est la meilleure façon:
la source
Le
RecyclerView
n'a pasOnClickListener
et devra le mettre en œuvre nous-mêmes.J'aime ajouter une
OnItemClickListener
interfaceAdapter
avec uneonClick
méthode invoquée lorsque vous cliquez sur la vue de l'élément dans leViewHolder
. Ainsi, la responsabilité de gérer le clic sur un élément est en dehors duViewHolder
etAdapter
. L'activité ou le fragment qui décidera quoi faireAjoutez une interface à l'écouteur et à l'objet écouteur.
Nous capturons le clic de la vue racine de l'élément et lorsque le rappel est déclenché, l'
onClick
écouteur appelle sur l'adaptateur.Puisque l'activité ou le fragment, fragment dans notre cas, nous affectons un écouteur à l'adaptateur et le rappel onClick nous obtiendrons l'élément sélectionné par position et ouvrirons une activité détaillée de l'élément.
la source
Malheureusement, il
RecyclerView
manque quelques fonctionnalitésListView
intégrées. Par exemple, la possibilité d'ajouterOnItemClickListener
un élément qui se déclenche lorsqu'un élément est cliqué.RecyclerView
vous permet de définir unOnClickListener
dans votre adaptateur, mais la transmission de cet écouteur de clics à partir de votre code d'appel, à l'adaptateur et auViewHolder
, est compliquée pour intercepter un simple clic d'élément.Vous devez également définir à l'
R.id.item_click_support
aide d'ids.xml:L'écouteur de clic de code résultant ressemble maintenant à ceci:
Pour une brève explication sur les clics de recyclage, veuillez consulter ce petit blog
la source
vous pouvez facilement définir setOnClickListener dans votre classe ViewHolder comme suit:
la source
Voici ce que j'ai fait En savoir plus et télécharger l'essentiel ici
Ajout du même ici
CustomItemClickListener.java
ItemsListAdapter.java
la source
D'après la plupart des réponses ci-dessus, ils semblent définir leurs écouteurs onclick sur des éléments individuels. Cependant, la solution que je suis sur le point d'offrir est très simple mais pas intuitive pour beaucoup. Beaucoup oublient que les autres composants sont toujours dans un composant parent qui est utilisé pour afficher les éléments dans les vues Liste ou Recycleur. Cette solution consiste simplement à définir un seul écouteur onclick sur cette vue parent et le tour est joué. La solution comprend également un moyen de transmettre la position de l'élément cliqué dans la liste ou la vue du recycleur. Ici, notre rootview principal est un CardView de la bibliothèque de support Android. Voici un exemple de code
la source
Mise en œuvre Kotlin de la réponse de Nhaarman :
RecyclerItemClickListener.java:
la source
la source
la source
Nous pouvons le faire en utilisant des références faibles Java. Sémantiquement, le détenteur de la vue est celui qui doit répondre à l'événement click ou le déléguer au répondeur correct.
Nos buts:
Pas:
Créez une interface pour gérer les réponses aux clics.
Implémentez cette interface dans l'activité qui gérera le clic.
Ajoutez une variable membre dans l'adaptateur RecyclerView pour contenir la référence faible et un constructeur qui la définit.
Faites de même dans RecyclerView ViewHolder et ajoutez une variable membre pour garder une trace de la position.
Définissez vos écouteurs au clic sur n'importe quelle vue que vous souhaitez dans le ViewHolder, puis rappelez au répondeur pour les gérer.
Modifiez votre méthode onBindViewHolder pour définir la position lors de la liaison.
Transmettez le répondeur au ViewHolder.
Dans le répondeur, vous pouvez maintenant utiliser getId () sur la vue pour déterminer quelle vue a été cliquée.
Et voici un Gist afin que vous puissiez voir comment tout cela s'imbrique: Gestion des clics RecyclerView
la source
Je suis conscient qu'il y a beaucoup de réponses, mais je pensais que je pourrais également en fournir la mise en œuvre. (Tous les détails peuvent être trouvés sur une autre question à laquelle j'ai répondu ).
Ainsi, pour ajouter un écouteur de clics, votre
ViewHolder
classe interne doit être implémentéeView.OnClickListener
. Cela est dû au fait que vous définirez unOnClickListener
sur leitemView
paramètre duViewHolder
constructeur de. Permettez-moi de vous montrer ce que je veux dire:Les seules autres choses que vous devez ajouter sont une interface personnalisée pour votre
Adapter
et une méthode de définition:Votre nouvelle prise en charge des clics
Adapter
est donc terminée.Maintenant, utilisons-le ...
C'est essentiellement la façon dont vous configurez une normale
Adapter
, sauf que vous utilisez votre méthode de définition que vous avez créée pour contrôler ce que vous ferez lorsque votre utilisateur cliquera sur un élément de liste particulier.Vous pouvez également consulter un ensemble d'exemples que j'ai faits sur ce Gist sur GitHub:
https://gist.github.com/FarbodSalamat-Zadeh/7646564f48ee708c1582c013e1de4f07
la source
Voici ce que je fais pour réutiliser
OnClickListener
dans ViewHoder Prendre le parent de l'élément
dans la balise onBindViewHolder définie comme position
et dans Onclick
la source
Pour moi, la façon la plus simple de le faire est celle-ci.
Constructeur d'adaptateur
L'interface liée
la source