viewholder recyclerview item holder getadapterposition from child java android android-recyclerview onitemclicklistener

java - recyclerview - getadapterposition



Recyclerview addOnItemTouchListener get whichsubview se hace clic dentro de la fila (4)

Implementé Recyclerview onclickListener desde esta solución de desbordamiento de pila . Esta solución funciona bien para los clics de elementos del reciclador. Pero no puedo hacer clic en la subvista (por ejemplo, ImageView, Botón) desde la fila.

mAttachmentRecyclerview.addOnItemTouchListener( new RecyclerItemClickListener(getApplicationContext(), new RecyclerItemClickListener.OnItemClickListener() { @Override public void onItemClick(View view, int position) { if (view.getId()==R.id.attachmnet_remove) { attachmentsList.remove(position); mAttachmentAdapter.notifyDataSetChanged(); attachmentCount--; } } } ));

onItemClick(view,position) siempre devuelve ID de vista como -1

¿Cómo hago un seguimiento de la vista en que se hace clic en la vista?


A continuación se muestra un ViewHolder que contiene dos vistas de texto a saber. title y description :

public class CustomViewHolder extends RecyclerView.ViewHolder { private final OnViewClickListener mListener; public final TextView title; public final TextView description; public interface OnViewClickListener { void onViewClick(View v, int adapterPosition); } public CustomViewHolder(View itemView, OnViewClickListener mListener) { super(itemView); this.mListener = mListener; title = (TextView) itemView.findViewById(R.id.titleTextView); description = (TextView) itemView.findViewById(R.id.descriptionTextView); title.setOnClickListener(onClickListener); description.setOnClickListener(onClickListener); } private final View.OnClickListener onClickListener = new View.OnClickListener() { @Override public void onClick(View view) { mListener.onViewClick(view, getAdapterPosition()); } }; }

Ambas subvistas tienen un OnClickListener adjunto que llama a la implementación OnViewClickListener personalizada que pasa la View que se hizo clic, así como la posición del elemento RecyclerView en el adaptador que recibió el evento de clic.

Finalmente, use View.getId() para recuperar el id de la vista OnViewClickListener en la implementación de OnViewClickListener .


Esa respuesta está desactualizada porque usa RecyclerView.getChildPosition(View) que está en desuso . Intente reemplazarlo con RecyclerView.getChildAdapterPosition(View) .

Si yo fuera tú, solo crearía oyentes para cada ViewHolder y sus vistas secundarias que quieras escuchar. Honestamente, no me parece ver el beneficio de usar ese método más complicado al que te refieres. Además, ese método solo le dirá que se hizo clic en un elemento, nada sobre las vistas secundarias del elemento.

Además, de acuerdo con los documentos , RecyclerView.OnItemTouchListener está destinado a ser utilizado cuando desea detectar un toque de un elemento mientras la lista se desplaza, no para toques regulares o directos.


Intenta agregar OnClickListeners a las subvistas.


Establecer etiquetas

Puede configurar Tag a sus vistas al inicializarlas a través de:

view1.setTag(1);

Esto establecerá la etiqueta de vista en 1.

luego en el método onItemClick:

@Override public void onItemClick(View view, int position) { if(view.getTag()==1) { //do something } else { //do something else }