¿Alguien que utilice RecyclerView
ha encontrado una manera de establecer un onClickListener
a los elementos en el RecyclerView
?
He pensado en establecer un listener en cada uno de los layouts para cada elemento, pero parece demasiado complicado.
Estoy seguro de que hay una forma de que el RecyclerView
escuche el evento onClick
, pero no puedo entenderlo.
Como la API ha cambiado radicalmente, no me sorprendería que tuvieras que crear un OnClickListener
para cada elemento. Sin embargo, no es tan complicado. En tu implementación de RecyclerView.Adapter<MyViewHolder>
, deberías tener:
private final OnClickListener mOnClickListener = new MyOnClickListener();
@Override
public MyViewHolder onCreateViewHolder(final ViewGroup parent, final int viewType) {
View view = LayoutInflater.from(mContext).inflate(R.layout.myview, parent, false);
view.setOnClickListener(mOnClickListener);
return new MyViewHolder(view);
}
El método onClick
:
@Override
public void onClick(final View view) {
int itemPosition = mRecyclerView.getChildLayoutPosition(view);
String item = mList.get(itemPosition);
Toast.makeText(mContext, item, Toast.LENGTH_LONG).show();
}
Mira una pregunta similar @CommonsWare's el comentario enlaza con esto, que implementa la interfaz OnClickListener
en el viewHolder
.
Aquí'hay un ejemplo sencillo del `ViewHolder
:
TextView textView;//declare global with in adapter class
public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
private ViewHolder(View itemView) {
super(itemView);
itemView.setOnClickListener(this);
textView = (TextView)view.findViewById(android.R.id.text1);
}
@Override
public void onClick(View view) {
Toast.makeText(view.getContext(), "position = " + getLayoutPosition(), Toast.LENGTH_SHORT).show();
//go through each item if you have few items within recycler view
if(getLayoutPosition()==0){
//Do whatever you want here
}else if(getLayoutPosition()==1){
//Do whatever you want here
}else if(getLayoutPosition()==2){
}else if(getLayoutPosition()==3){
}else if(getLayoutPosition()==4){
}else if(getLayoutPosition()==5){
}
//or you can use For loop if you have long list of items. Use its length or size of the list as
for(int i = 0; i<exampleList.size(); i++){
}
}
}
El Adaptador
tiene entonces este aspecto:
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view =LayoutInflater.from(parent.getContext()).inflate(android.R.layout.simple_list_item_1, parent, false);
return new ViewHolder(view);
}
Esto es lo que terminé necesitando, por si alguien lo encuentra útil:
public static class ViewHolder extends RecyclerView.ViewHolder {
public ViewHolder(View item) {
super(item);
item.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Log.d("RecyclerView", "onClick:" + getAdapterPosition());
}
});
}
}
Fuente: http://blog.csdn.net/jwzhangjie/article/details/36868515