¿Alguien ha RecyclerViewencontrado una manera de establecer un onClickListenerelemento en el RecyclerView? Pensé en configurar un oyente para cada uno de los diseños para cada elemento, pero eso parece demasiado complicado, estoy seguro de que hay una manera de RecyclerViewescuchar el onClickevento, pero no puedo entenderlo.
java
android
android-recyclerview
onclick
onclicklistener
CurtJRees
fuente
fuente

Respuestas:
Como las API han cambiado radicalmente, no me sorprendería si creara una
OnClickListenerpara cada elemento. Sin embargo, no es una molestia. En su implementación deRecyclerView.Adapter<MyViewHolder>, debe tener:El
onClickmétodo:fuente
onClick(), perteneciente aOnClickListenerse puede adjuntar a CUALQUIER vista. ¡Toda la pregunta aquí es cuál! Haga un esfuerzo, un método no solo se identifica por un nombre, sino también al menos por una clase. Si no dice que su código debe agregarse al adaptador, su respuesta realmente no ayuda.Aquí hay una forma mejor y menos acoplada de implementar un
OnClickListenerpara aRecyclerView.Fragmento de uso:
RecyclerItemClickListenerimplementación:fuente
Lo hago de esta manera, sin clases indebidas, detectores, etc. Código simple dentro de nuestro adaptador. Solución especialmente mejor para longClick que la presentada anteriormente.
Luego dentro del fragmento o actividad, simplemente presione:
fuente
Vea una pregunta similar en los enlaces de comentarios de @ CommonsWare a esto , que implementa la
OnClickListenerinterfaz en elviewHolder.Aquí hay un ejemplo simple de
ViewHolder:El
Adapterentonces se ve así:fuente
ListViewya era problemático si tenía que crear una lista de objetos más complicados que simples filas. ¿Qué sucede si necesita manejar diferentes eventos dependiendo de dónde haga clic en el elemento en ListView? Estás jodido. Aquí tienes cada oyente.getPosition()está en desuso, usogetAdapterPosition()o en sugetLayoutPosition()lugar.Basado en la respuesta de Jacob Tabak (+1 para él), pude agregar a LongLick oyente:
Entonces puedes usarlo así:
fuente
public void onRequestDisallowInterceptTouchEvent (boolean disallowIntercept){}view.getId() == R.id.selectionEsto es lo que funcionó para mí. Adjunte el
OnClickListenera laonBindView. Realmente no sé si esto afectará el rendimiento, pero parece funcionar bien con poco código.fuente
Esto fue muy difícil para mí tener un elemento de escucha de clics en la actividad y también tener un elemento de escucha de clics para una vista única del elemento que no se activará en el elemento de escucha de clics. Después de jugar con la respuesta de Jacob Tabak, respeto su respuesta al hacer clic en el elemento si no se presentan otras acciones táctiles dentro del elemento.
Tengo una
OnClickListenerinterfaz personalizada que tiene un evento de clic de elemento que contiene la vista del elemento seleccionado y la posición del elemento desde el adaptador. Presento una instancia de él en el constructor (o puede ser con setter) y lo adjunto al contenedor de vistas, haga clic en el oyente de escucha.También tengo otro detector de clics en el adaptador (puede estar en el soporte de la vista) que manejará el clic de vista actual desde el contenedor.
En la actividad, debe inicializar el adaptador pasando la instancia de
OnItemClickListenerY mi ViewHolder
fuente
Esto es lo que terminé necesitando, en caso de que alguien lo encuentre útil:
Fuente: http://blog.csdn.net/jwzhangjie/article/details/36868515
fuente
Tengo buena solución para
RecyclerView'sonItemClickListenerpara los elementos y subelementosPaso 1- Crea una interfaz
Paso 2- Luego úsalo en el
onBindViewHoldermétodo del adaptador de la siguiente maneraPaso 3- encuentre y configure la vista del reciclador en la actividad o fragmento donde está usando esto
Paso 4- Finalmente implemente la interfaz en la actividad o fragmento donde está utilizando la vista de reciclaje
fuente
Aquí esta lo que hice. Esta solución es compatible con onClick y onLongClick tanto en los elementos RecyclerView como en las vistas internas de los elementos RecyclerView (vistas internas).
Etiqueto viewHolder en las vistas de mi elección:
Y utilizo holder.getPosition () para recuperar la posición en el método onClick () (onLongClick es similar):
Una variante con getChildPosition también funciona. Tenga en cuenta que para las vistas internas, en onClick () use:
En mi opinión, la ventaja de esta solución es que cuando uno hace clic en la imagen, solo se llama al oyente de imágenes onclick (), mientras que cuando combiné la solución de Jacob para una vista de RecyclerView Item y mi solución para vistas internas, la vista de RecyclerView Item onclick ( ) también se llama (cuando se hace clic en la imagen).
fuente
Hay una manera mucho más fácil de hacer esto. Simplemente aplique al hacer clic en
onBindViewHolderla vista de raíz.Considere que esta es su vista para el adaptador,
Luego haga lo siguiente en su adaptador
fuente
Puedes pasar un
clickListeneraAdapter.En su
Activity:luego pásalo a
Adapter:En
AdaptersonCreateViewHolder:fuente
holdervalores a través de la intención?He desarrollado una biblioteca ligera para Android, puedes visitar https://github.com/ChathuraHettiarachchi/RecycleClick
y siga para la siguiente muestra
fuente
Puede implementar OnClickListener en su clase ViewHolder
Y onBindViewHolder establece el elemento del titular de la vista
fuente
Demasiado simple y efectivo.
En lugar de implementar la interfaz
View.OnClickListenerdentro del soporte de vista o crear e interactuar e implementar la interfaz en su actividad, utilicé este código para unaOnClickListenerimplementación simple .fuente
Todas las respuestas publicadas hasta el momento son excelentes soluciones, sin embargo, si no desea lidiar con demasiados detalles de implementación y solo desea que funcione de manera similar a como lo hace ListView, recomendaría usar TwoWay-View, como se ve aquí:
https://github.com/lucasr/twoway-view
Tenga en cuenta que esta implementación también admite una presión prolongada sobre los elementos, así como también soporte para estados presionados (que es algo importante que carecen de otras soluciones a esta pregunta).
Si no desea usar toda la biblioteca, eche un vistazo a la clase ClickItemTouchListener , que se puede usar de forma independiente si es necesario. El único problema que encontré en este momento es con una pulsación larga + desplazamiento, parece tener un comportamiento incorrecto.
fuente
Si desea capturar el evento de clic en elementos individuales, simplemente implemente
OnClickListenerenViewHolderclase y luego configure los oyentes de clics en vistas individuales o completasitemView.El siguiente ejemplo muestra lo mismo
fuente
Para mí, esta es la mejor manera:
fuente
El
RecyclerViewno tiene unOnClickListenery tendrá que implementarlo nosotros mismos.Me gusta agregar una
OnItemClickListenerinterfazAdaptercon unonClickmétodo invocado al hacer clic en la vista del elemento desdeViewHolder. Por lo tanto, la responsabilidad de administrar el clic en un elemento está fuera deViewHolderyAdapter. ¿La actividad o fragmento que decidirá qué hacer?Agregue una interfaz al oyente y al objeto del oyente.
Capturamos el clic de la vista raíz del elemento y cuando se activa la devolución de llamada, se
onClickescucha la llamada en el adaptador.Dado que la actividad o fragmento, fragmento en nuestro caso, asignamos un oyente al adaptador y la devolución de llamada onClick obtendremos el elemento seleccionado por posición y abriremos una actividad detallada del elemento.
fuente
Desafortunadamente,
RecyclerViewfaltan un par de características que seListViewhabían incorporado. Por ejemplo, la capacidad de agregar un elementoOnItemClickListenerque se activa cuando se hace clic en un elemento.RecyclerViewle permite configurar unOnClickListeneren su adaptador, pero pasar ese oyente de clics desde su código de llamada, al adaptador y alViewHolder, es complicado para detectar un simple clic de elemento.También necesita definir
R.id.item_click_supportusando ids.xml:El escucha de clics de código resultante ahora se ve así:
Para una breve explicación sobre los clics de la vista de reciclaje, eche un vistazo a este littlerobots_blog
fuente
puede definir fácilmente setOnClickListener en su clase ViewHolder de la siguiente manera:
fuente
Esto es lo que hice Leer más y descargar la esencia aquí
Agregando lo mismo aquí
CustomItemClickListener.java
ItemsListAdapter.java
fuente
Según la mayoría de las respuestas anteriores, parecen estar configurando sus onclicklisteners a elementos individuales. Sin embargo, la solución que voy a ofrecer es muy simple pero no intuitiva para muchos. Muchos se olvidan de que los otros componentes siempre están en un componente principal que se usa para mostrar elementos en las vistas de Lista o Reciclador. Esta solución se trata de configurar un solo oyente onclick para esta vista principal y se juega el turno. La solución también incluye una forma de pasar la posición del elemento en el que se hace clic desde la lista o la vista del reciclador. Aquí, nuestro rootview principal es un CardView de la biblioteca de soporte de Android. Aquí hay un código de muestra
fuente
Implementación de Kotlin de la respuesta de nhaarman :
RecyclerItemClickListener.java:
fuente
fuente
fuente
Podemos hacer esto usando referencias débiles de Java. Semánticamente, el titular de la vista es el que debe responder al evento de clic o delegarlo al respondedor correcto.
Nuestras metas:
Pasos:
Cree una interfaz para manejar respuestas de clic.
Implemente esta interfaz en la Actividad que manejará el clic.
Agregue una variable miembro en el Adaptador RecyclerView para contener la Referencia débil y un constructor que la establezca.
Haga lo mismo en RecyclerView ViewHolder y agregue una variable miembro para realizar un seguimiento de la posición.
Establezca sus oyentes de clic en cualquier vista que desee en ViewHolder, luego vuelva a llamar al respondedor para manejarlos.
Cambie su método onBindViewHolder para establecer la posición al vincular.
Pase el respondedor al ViewHolder.
En el respondedor, ahora puede usar getId () en la vista para averiguar en qué vista se hizo clic.
Y aquí hay un resumen para que pueda ver cómo encaja todo: manejo de clics de RecyclerView
fuente
Soy consciente de que hay muchas respuestas, pero pensé que podría proporcionar mi implementación también. (Los detalles completos se pueden encontrar en otra pregunta que respondí ).
Entonces, para agregar un escucha de clics, su
ViewHolderclase interna necesita implementarseView.OnClickListener. Esto se debe a que va a configurar unaOnClickListeneralitemViewparámetro delViewHolderconstructor 's. Déjame mostrarte lo que quiero decir:Las únicas otras cosas que necesita agregar son una interfaz personalizada para usted
Adaptery un método de establecimiento:Entonces su nuevo soporte de clics
Adapterestá completo.Ahora, usémoslo ...
Básicamente, es cómo configurar un normal
Adapter, excepto que usa el método de establecimiento que creó para controlar lo que hará cuando su usuario haga clic en un elemento de la lista en particular.También puede ver un conjunto de ejemplos que hice en este Gist en GitHub:
https://gist.github.com/FarbodSalamat-Zadeh/7646564f48ee708c1582c013e1de4f07
fuente
Esto es lo que hago para reutilizar
OnClickListeneren ViewHoder Tome el elemento primario de itemlayout
en onBindViewHolder establece la etiqueta como posición
y en Onclick
fuente
Para mí, la forma limpia de hacerlo es esta.
Constructor adaptador
La interfaz vinculada
fuente