当前位置: 移动技术网 > IT编程>移动开发>Android > Android中RecyclerView点击Item设置事件

Android中RecyclerView点击Item设置事件

2019年07月24日  | 移动技术网IT编程  | 我要评论

全自动晾衣架,adayo,玉林二手房网

在上一篇中提到,recyclerview不再负责item视图的布局及显示,所以recyclerview也没有为item开放onitemclick等点击事件,这就需要开发者自己实现。博客最下面有demo程序运行动画。

奉上demo的github链接

在调研过程中,发现有同学修改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设置事件,希望对大家有所帮助

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网