recyclerview item点击事件
recyclerview早就不陌生了,比起过去传统的listView,样式更多,也较为高效一点,这里整理一下recylerview中item的点击事件。
recyclerview和listView不同的地方,在于RecyclerView不再负责Item视图的布局及显示,所以RecyclerView也没有为Item开放OnItemClick等点击事件,那么要想实现点击或是长按事件,就需要开发者自己来实现。
这里实现的方式也是网上大部分的实现方式,很方便:在ViewHolder中实现点击监听,而具体的点击处理事件有Adapter在绑定viewholder时传入,同时,在Adapter中暴露方法,可以在使用Adapter的地方,传入实例化的点击事件。这样,就需要新建一个借口,所有自定义的点击事件都继承该借口。具体流程如下:
(不擅于画图,凑合看吧)
那么具体的实现如下:
1、定义接口:
public interface MyItemOnClickListener { public void onItemOnClick(View view,int postion); }
在接口中,定义接口方法onItemOnClick方法,在里面实现具体的点击响应事件,同时传入两个参数:view和postion。和ListView中item的点击一样。
2、在ViewHolder中实现单击监听:
class FMListHolder extends RecyclerView.ViewHolder implements View.OnClickListener{ TextView textView; MyItemOnClickListener mListener; public FMListHolder(View itemView,MyItemOnClickListener myItemOnClickListener) { super(itemView); textView= (TextView) itemView.findViewById(R.id.id_item_text); this.mListener=myItemOnClickListener; itemView.setOnClickListener(this); } @Override public void onClick(View view) { if(mListener!=null){ mListener.onItemOnClick(view,getPosition()); } } }
上面的代码就是ViewHolder,在itemView或是里面包含的子View实现setOnClickListener,在OnClick中接受接口实例化传入的具体处理事件,即mListener。在这里也能看的出来,只有viewholder中可以实现点击监听。
3、在Adapter中绑定ViewHolder时传入接口实例化后的类
@Override public FMListAdapter.FMListHolder onCreateViewHolder(ViewGroup parent, int viewType) { FMListHolder fmListHolder= new FMListHolder(LayoutInflater.from(mContext).inflate(R.layout.item_fm_list,parent,false) ,mMyItemOnClickListener); return fmListHolder; }
看的出,在新建ViewHoler的过程中,传入了参数 mMyItemOnClickListener,该参数肯定在实现Adapter的地方传入Adapter中,所以要在Adapter中对外暴露方法:
public void setItemOnClickListener(MyItemOnClickListener listener){ mMyItemOnClickListener=listener; }
4、在实现Adapter的地方实现具体点击事件
mAdapter.setItemOnClickListener(new MyItemOnClickListener() { @Override public void onItemOnClick(View view, int postion) { Log.e(TAG,postion+""); } });
其实就是在使用RecyerView的地方,调用Adapter暴露的方法,将MyItemOnClickListener实例化话,并在方法onItemOnClick中实现事件,这里只是打印Log。
这个博客很基础,就不粘贴全部的代码了。不懂的可以留言给我。
不是闷骚的程序员算不上程序员。我的微信公众号“那点鼻事”,在这里周一到周五每天一篇文章,与技术无关,只哈牛逼。