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

Android XRecyclerView最简单的item点击事件处理

程序员文章站 2022-11-08 14:39:28
以前一直都是用pulltorefresh,后来觉得还是太out了。现在很多人都是用recyclerview,很简单的用法,布局多样化,主要是有瀑布流。这才知道recycle...

以前一直都是用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()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。