¿Alguien ha RecyclerView
encontrado una manera de establecer un onClickListener
elemento 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 RecyclerView
escuchar el onClick
evento, 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
OnClickListener
para cada elemento. Sin embargo, no es una molestia. En su implementación deRecyclerView.Adapter<MyViewHolder>
, debe tener:El
onClick
método:fuente
onClick()
, perteneciente aOnClickListener
se 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
OnClickListener
para aRecyclerView
.Fragmento de uso:
RecyclerItemClickListener
implementació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
OnClickListener
interfaz en elviewHolder
.Aquí hay un ejemplo simple de
ViewHolder
:El
Adapter
entonces se ve así:fuente
ListView
ya 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.selection
Esto es lo que funcionó para mí. Adjunte el
OnClickListener
a 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
OnClickListener
interfaz 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
OnItemClickListener
Y 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
'sonItemClickListener
para los elementos y subelementosPaso 1- Crea una interfaz
Paso 2- Luego úsalo en el
onBindViewHolder
mé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
onBindViewHolder
la vista de raíz.Considere que esta es su vista para el adaptador,
Luego haga lo siguiente en su adaptador
fuente
Puedes pasar un
clickListener
aAdapter
.En su
Activity
:luego pásalo a
Adapter
:En
Adapter
sonCreateViewHolder
:fuente
holder
valores 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.OnClickListener
dentro del soporte de vista o crear e interactuar e implementar la interfaz en su actividad, utilicé este código para unaOnClickListener
implementació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
OnClickListener
enViewHolder
clase 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
RecyclerView
no tiene unOnClickListener
y tendrá que implementarlo nosotros mismos.Me gusta agregar una
OnItemClickListener
interfazAdapter
con unonClick
mé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 deViewHolder
yAdapter
. ¿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
onClick
escucha 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,
RecyclerView
faltan un par de características que seListView
habían incorporado. Por ejemplo, la capacidad de agregar un elementoOnItemClickListener
que se activa cuando se hace clic en un elemento.RecyclerView
le permite configurar unOnClickListener
en 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_support
usando 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
ViewHolder
clase interna necesita implementarseView.OnClickListener
. Esto se debe a que va a configurar unaOnClickListener
alitemView
parámetro delViewHolder
constructor 's. Déjame mostrarte lo que quiero decir:Las únicas otras cosas que necesita agregar son una interfaz personalizada para usted
Adapter
y un método de establecimiento:Entonces su nuevo soporte de clics
Adapter
está 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
OnClickListener
en 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