最终目的
模拟ListView的setOnItemClickListener()方法,调用者只须调用类似于setOnItemClickListener的东西就能获得被点击item的相关数据。
原理
为RecyclerView的每个子item设置setOnClickListener,然后在onClick中再调用一次对外封装的接口,将这个事件传递给外面的调用者。而“为RecyclerView的每个子item设置setOnClickListener”在Adapter中设置。其实直接在onClick中也能完全处理item的点击事件,但是这样会破坏代码的逻辑。
步骤
1、在MyAdapter中定义接口
public interface OnItemClickListener{
void onItemClick(int position);
}
2、声明这个接口变量
private OnItemClickListener mItemClickListener;
3、在onCreateViewHolder()中为每个item添加点击事件
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = View.inflate(mContext, R.layout.item_linear, null);
RecyclerView.ViewHolder holder = new LinearViewholder(view);
view.setOnClickListener(this);
return holder;
}
@Override
public void onClick(View v) {
if (mItemClickListener!=null){
mItemClickListener.onItemClick((Integer) v.getTag());
}
}
4、注意上面调用接口的onItemClick()中的v.getTag()方法,这需要在onBindViewHolder()方法中设置和item相关的数据
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
LinearViewholder viewholder = (LinearViewholder) holder;
viewholder.mTextView.setText(mList.get(position));
viewholder.itemView.setTag(position);
}
5、提供set方法
public void setItemClickListener(OnItemClickListener itemClickListener) {
mItemClickListener = itemClickListener;
}
6、在MainActivity中
MyRecyclerViewAdapter adapter = new MyRecyalerViewAdapter();
adapter.setItemClickListener(this);
@Override
public void onItemClick(int position) {
Toast.makeText(this, ""+position, Toast.LENGTH_SHORT).show();
}