android - support - ¿Por qué OnClickListener en un ViewHolder no funciona?
recyclerview onclick get position (2)
Estoy tratando de implementar una forma de manejar la selección de elementos en un RecyclerView
. Personalmente, no me gusta la forma sugerida en algunas respuestas sobre el paso de los gestos, y pensé que la implementación de un OnClickListener
, como se sugiere here y here , fue muy clara.
El hecho es que ... ¡este patrón realmente no funciona! Realmente no puedo entender por qué nunca se llama a mi OnClickListener.onClick
. Es como si otro método interceptara el clic antes de que onClick
pueda encargarse de él.
Este es mi código:
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
TextView tvName;
ImageView star;
public ViewHolder(View itemView) {
super(itemView);
tvName = (TextView) itemView.findViewById(R.id.CHAT_ITEM_name);
star = (ImageView) itemView.findViewById(R.id.CHAT_ITEM_star);
Fonts.setTypeface(tvName, regular);
}
@Override
public void onClick(View view) {
int position = getLayoutPosition();
select(position);
}
}
Desafortunadamente, es muy importante para mí poder acceder a la posición del elemento seleccionado en todo el conjunto de datos para eliminarlo, por lo que hacer algo como indexOfChild
no es aceptable también: lo intenté, pero este método le da la posición del elemento en la parte list.remove(position)
de la lista, lo que hace que list.remove(position)
imposible.
Mirando el código actualizado: no está configurando onClickListener en ninguna de las vistas en ViewHolder. Es un error comprensible olvidar al oyente de clics.
Solo usa:
tvName.setOnClickListener(this);
star.setOnClickListener(this);
Puedes configurar ambos o solo uno de ellos. También puede simplemente obtener el diseño principal de estas dos vistas, de modo que se pueda hacer clic en todo el elemento en el adaptador.
itemView.setOnClickListener(this);
Puedes hacerlo en tu onBindViewHolder
@Override
public void onBindViewHolder(ReportViewHolder holder, int position {
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
// handle your click here.
} });
}