Android中RecyclerView点击Item设置事件
在上一篇android recylerview入门教程中提到,recyclerview不再负责item视图的布局及显示,所以recyclerview也没有为item开放onitemclick等点击事件,这就需要开发者自己实现。博客最下面有demo程序运行动画。
在调研过程中,发现有同学修改recyclerview源码来实现item的点击监听,但认为这不是一个优雅的解决方案,最终决定在recyclerview.viewholder上做文章。
思路是:因为viewholder我们可以拿到每个item的根布局,所以如果我们为根布局设置单独的onclick监听并将其开放给adapter,那不就可以在组装recyclerview时就能够设置itemclicklistener,只不过这个listener不是设置到recyclerview上而是设置到adapter。
我们首先看viewholder的代码:
public class myviewholder extends viewholder implements onclicklistener,onlongclicklistener{ public imageview iv; public textview tv; private myitemclicklistener mlistener; private myitemlongclicklistener mlongclicklistener; public myviewholder(view rootview,myitemclicklistener listener,myitemlongclicklistener longclicklistener) { super(rootview); iv = (imageview)rootview.findviewbyid(r.id.item_iv); tv = (textview)rootview.findviewbyid(r.id.item_tv); this.mlistener = listener; this.mlongclicklistener = longclicklistener; rootview.setonclicklistener(this); rootview.setonlongclicklistener(this); } /** * 点击监听 */ @override public void onclick(view v) { if(mlistener != null){ mlistener.onitemclick(v,getposition()); } } /** * 长按监听 */ @override public boolean onlongclick(view arg0) { if(mlongclicklistener != null){ mlongclicklistener.onitemlongclick(arg0, getposition()); } return true; } }</span>
因为在构造viewholder时,rootview将作为一个必传参数传递进来,所以我们只需要拿到rootview并给其绑定点击监听事件即可。
下面要考虑的就是怎样把listener传递进来。demo中设定了监听点击事件的interface:myitemclicklistener:
public interface myitemclicklistener { public void onitemclick(view view,int postion); }
myitemclicklistener模仿listview的onitemclicklistener,开放了view和position两个参数,这对习惯使用listview的开发者们使用起来更得心应手。从viewholder的代码中可以看到,执行onclick方法时会调用getposition()将当前item的位置回调给listener。getposition()是viewholder的内置方法,可直接使用。
上面提到过,listener是设定到adapter上的,所以adapter就需要对外开放相关方法:
@override public myviewholder oncreateviewholder(viewgroup parent, int viewtype) { view itemview = layoutinflater.from(parent.getcontext()).inflate(r.layout.item, parent,false); myviewholder vh = new myviewholder(itemview,mitemclicklistener,mitemlongclicklistener); return vh; } /** * 设置item点击监听 * @param listener */ public void setonitemclicklistener(myitemclicklistener listener){ this.mitemclicklistener = listener; } public void setonitemlongclicklistener(myitemlongclicklistener listener){ this.mitemlongclicklistener = listener; }
上篇博客(android-recylerview初识)提到过,adapter的oncreateviewholder是负责实例化每个item的视图,所以我在实例化视图时就将listener传递给viewholder。
最后就是组装recyclerview时根据需求设定点击监听了:
/** * 初始化recylerview */ private void initview(){ mrecyclerview = (recyclerview)findviewbyid(r.id.recyclerview); mylayoutmanager manager = new mylayoutmanager(this); manager.setorientation(linearlayout.horizontal);//默认是linearlayout.vertical mrecyclerview.setlayoutmanager(manager); mrecyclerview.setitemanimator(new defaultitemanimator()); } private void initdata(){ this.mdata = new arraylist<myitembean>(); for(int i=0;i<20;i++){ myitembean bean = new myitembean(); bean.tv = "xmy"+i; mdata.add(bean); } this.madapter = new myadapter(mdata); this.mrecyclerview.setadapter(madapter); recyclerview.itemdecoration decoration = new mydecoration(this); this.mrecyclerview.additemdecoration(decoration); this.madapter.setonitemclicklistener(this); this.madapter.setonitemlongclicklistener(this); }
demo为viewholder设置了onclick和onlongclicklistener,在activity中我们实现了接口方法并在里面打印toast提示:
@override public void onitemclick(view view, int postion) { myitembean bean = mdata.get(postion); if(bean != null){ toast.maketext(this, bean.tv, toast.length_short).show(); } } @override public void onitemlongclick(view view, int postion) { myitembean bean = mdata.get(postion); if(bean != null){ toast.maketext(this, "longclick "+bean.tv, toast.length_short).show(); } }
下面是demo的运行动画。
以上所述是小编给大家介绍的android中recyclerview点击item设置事件,希望对大家有所帮助
推荐阅读
-
Android中EditText的drawableRight属性设置点击事件
-
Android使用RecyclerView实现自定义列表、点击事件以及下拉刷新
-
android中在Activity中响应ListView内部按钮的点击事件的两种方法
-
Android使用RecyclerView实现自定义列表、点击事件以及下拉刷新
-
android中在Activity中响应ListView内部按钮的点击事件的两种方法
-
Android 中ListView点击Item无响应问题的解决办法
-
Android 中ListView点击Item无响应问题的解决办法
-
Android 中RecyclerView多种item布局的写法(头布局+脚布局)
-
Android RecyclerView的Item点击事件实现整理
-
Android 中RecyclerView多种item布局的写法(头布局+脚布局)