用户登录
用户注册

分享至

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

  • 作者: 嗫?暁雲?
  • 来源: 51数据库
  • 2021-09-21

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

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

软件
前端设计
程序设计
Java相关