Android XRecyclerView最简单的item点击事件处理
以前一直都是用pulltorefresh,后来觉得还是太out了。现在很多人都是用recyclerview,很简单的用法,布局多样化,主要是有瀑布流。这才知道recyclerview.layoutmanager真正的强大。
但是说要addheaderview这个的话,recyclerview没有实现,所以我用了xrecyclerview,其实它也是在recyclerview的基础上再次封装的,用起来还是蛮好的。
这里说一下,正确的使用xrecyclerview点击item做事件处理的问题。其实就是在recyclerview.viewholder里面的item做点击,那么设计到一个问题就是如何简单使用了。
一般我们会直接在item布局中的最外层设置一个id=”@+id/…”,然后在onbindviewholder中用holder.**.setonclicklistener()进行事件处理,你看看你是不是这样做的,如果这样做的话,那就继续往下看,教你简单的。
简单使用item的点击事件
1、先看下recyclerview.viewholder源码是怎么写的
/** * a viewholder describes an item view and metadata about its place within the recyclerview. * * <p>{@link adapter} implementations should subclass viewholder and add fields for caching * potentially expensive {@link view#findviewbyid(int)} results.</p> * * <p>while {@link layoutparams} belong to the {@link layoutmanager}, * {@link viewholder viewholders} belong to the adapter. adapters should feel free to use * their own custom viewholder implementations to store data that makes binding view contents * easier. implementations should assume that individual item views will hold strong references * to <code>viewholder</code> objects and that <code>recyclerview</code> instances may hold * strong references to extra off-screen item views for caching purposes</p> */ public static abstract class viewholder { public final view itemview; ....... public viewholder(view itemview) { if (itemview == null) { throw new illegalargumentexception("itemview may not be null"); } this.itemview = itemview; } ....... }
2、再来看看我们继承它做了什么事情
public class xrviewholder extends recyclerview.viewholder { public xrviewholder(view view) { super(view); butterknife.bind(this, view); } ....... public void onbindviewholder(vh holder, final int position) { if (position >= 0) { holder.itemview.setonclicklistener(new onclicklistener() { @override public void onclick(view v) { itemclick(getitem(position), position); } }); } } }
看到我们自定义的xrviewholder的构造方法中也用到了super(view)。
其实这里的view就是item的布局,这样的话,我们要实现点击事件就很容易了,可以直接在用holder.itemview.setonclicklistener
item的点击错位问题
用xrecyclerview.getchildat(position).setonclicklistener()出现错位问题,如果你在addheaderview就会出现这种错位的问题会更加明显,可以先来看看xrecyclerview里面的部分源码。
public class xrecyclerview extends recyclerview { private wrapadapter mwrapadapter; ...... public void addheaderview(view view) { sheadertypes.add(header_init_index + mheaderviews.size()); mheaderviews.add(view); if (mwrapadapter != null) { mwrapadapter.notifydatasetchanged(); } } ...... private class wrapadapter extends recyclerview.adapter<viewholder> { @override public recyclerview.viewholder oncreateviewholder(viewgroup parent, int viewtype) { if (viewtype == type_refresh_header) { return new simpleviewholder(mrefreshheader); } else if (isheadertype(viewtype)) { return new simpleviewholder(getheaderviewbytype(viewtype)); } else if (viewtype == type_footer) { return new simpleviewholder(mfootview); } return adapter.oncreateviewholder(parent, viewtype); } }
当我们每次addheaderview时他都会进行notifydatasetchanged,而且在oncreateviewholder也有了对应的isheadertype判断,所以当你想选择第一个item做事件处理时可能就pos=0是属于headerview。
总结
item点击事件简单方便快捷的方式:holder.itemview.setonclicklistener()
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
上一篇: 凉面 可丽卷大肠杆菌群 多到数不清
下一篇: 山区旅游要注意哪些危险