欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android中RecyclerView点击Item设置事件

程序员文章站 2024-03-04 19:17:12
在上一篇android recylerview入门教程中提到,recyclerview不再负责item视图的布局及显示,所以recyclerview也没有为item开放on...

在上一篇android recylerview入门教程中提到,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设置事件

以上所述是小编给大家介绍的android中recyclerview点击item设置事件,希望对大家有所帮助