开源框架BaseRecyclerViewAdapterHelper使用——RecyclerView万能适配器
BRVAH官方使用指南(持续更新)http://www.jianshu.com/p/b343fcff51b0
一、框架引入
- 先在项目的 build.gradle(Project:XXXX) 的 repositories 添加:
-
allprojects {
repositories {
...
maven { url "https://jitpack.io" }
}
}
- 然后在Module的 build.gradle(Module:app) 的 dependencies 添加:
注意: 一旦出现加载失败的情况,只有两种情况:
配置没配置好,有几种情况:
1. 只配置了 dependencies
2. 配置 repositories,但是位置错了,build.gradle(Project:XXXX) 文件下的repositories有两个,一个是buildscript下面的,一个是allprojects下面的,要配置到allprojects下面才是对的。
3. 版本号前面多一个v,这个是我的锅,在2.1.2版本之前都是带v的,之后(包含2.1.2)都不需要带v。
二、Adapter的最基本使用方法
2.1 常用示例代码
-
和原生的adapter相比,减少70%的代码量。
-
首先看一段使用示例代码:
1、使用: 首先需要继承BaseQuickAdapter,然后BaseQuickAdapter<Status, BaseViewHolder>第一个泛型Status是数据实体类型,第二个BaseViewHolder是ViewHolder其目的是为了支持扩展ViewHolder。
2、赋值:可以直接使用viewHolder对象点相关方法通过传入viewId和数据进行,方法支持链式调用。如果是加载网络图片或自定义view可以通过viewHolder.getView(viewId)获取该控件。
viewHolder.getLayoutPosition() 获取当前item的position
2.2 最基本使用示例Demo
- 最后一步:在Activity中使用该适配器
MainActivity.java
三、点击事件
3.1 条目事件
Item的点击事件
Item的长按事件
注意事项
- 在嵌套recycleView的情况下需要使用你使用 adapter. setOnItemClickListener 来设置点击事件,如果使用recycleView.addOnItemTouchListener会累计添加的。
3.2 条目子控件事件
Item子控件的点击事件
- 首先:在adapter的convert方法里面通过 helper.addOnClickListener 绑定一下子控件的控件id
Item子控件的长按事件
注意事项
- 设置子控件的事件,如果不在adapter中绑定,点击事件无法生效,因为无法找到你需要设置的控件。
多个Item子控件事件
如果需要在子控件事件中获取其他子控件可以使用:
比如:
注意:如果有header的话需要处理一下position加上 headerlayoutcount。
四、添加列表加载动画
-
给条目添加动画也是比较常见的需求
-
开启动画(默认为渐显效果)
- 该适配器提供了5种动画效果(渐显、缩放、从下到上,从左到右、从右到左)
- 设置不显示动画数量(老实讲,我没明白这个方法的效果是啥,因为我并没有看到效果 0.0)
由于进入界面的item都是很多的速度进来的所以不会出现滑动显示的依次执行动画效果,这个时候会一起执行动画,如果觉得这样的效果不好可以使用setNotDoAnimationCount设置第一屏item不执行动画,但是如果需要依次执行动画可以重写startAnim让第一个屏幕的item动画延迟执行即可。
五、添加头部、尾部
- 默认出现了头部就不会显示Empty,和尾部,配置以下方法也支持同时显示:
- 默认头部尾部都是占满一行,如果需要不占满可以配置:
六、上拉加载
- 加载完成(注意不是加载结束,而是本次数据加载结束并且还有下页数据)
注意:如果上拉结束后,下拉刷新需要再次开启上拉监听,需要使用setNewData方法填充数据。
- 打开或关闭加载(一般用于下拉的时候做处理,因为上拉下拉不能同时操作)
设置自定义加载布局
七、下拉加载(符合聊天软件下拉历史数据需求)
1、这里的下拉加载我个人觉得不好用,并不像我们常用的那种下拉加载(当然有可能是我没有合理使用)
2、所以如果是需要下拉刷新的功能,我个人会使用SwipeRefreshLayout
开始加载的位置
八、分组布局
- adapter构造需要传入两个布局id,第一个是item的,第二个是head的,在convert方法里面加载item数据,在convertHead方法里面加载head数据:
九、多布局
9.1 实现MultiItemEntity的方式
- 实体类必须实现MultiItemEntity,在设置数据的时候,需要给每一个数据设置itemType
- 在适配器构造函数里面addItemType绑定type和layout的关系
- 如果考虑到在GridLayoutManager复用item问题可以配置
Demo实例演示
1.我们的数据不直接传给适配器,而是通过MultiItemEntity来传递
2.适配器构造里必须绑定type和layout的关系
- 废话不多说,演示一个小demo(这里Item布局我就不贴出来了)
第一步:创建MultiItemEntity类
第二步:创建适配器
第三步:最后当然是在我们的Activity里编写代码
最后:已近完事了,可以运行了,
9.2 为 BaseQuickAdapter 设置代理的方式
-
从上文中,我们可以知道,其实多布局的本质还是要用某一个变量来区分,上述的方法是使用专门提供得MultiItemEntity接口,让我们实现,从而进行区分;
-
既然是某一个变量来区分,那我们能不能不实现MultiItemEntity接口,直接在适配器里进行区分呢?
-
官方还给出了一种方式,给BaseQuickAdapter 设置代理
-
首先我们先看一下官方给出的文档(分三步)
- 可能对于刚接触Android的朋友会看的很懵逼,完全不知道该怎么用,那是因为我们对面向对象的思想理解的还不是很深刻,没关系,这里我也写一个简单的Demo,希望能够帮助理解;
Demo实例演示
首先:我给Model类添加一个变量来区分类型
其次:编写适配器
最后:在Activity中使用该适配器
- OK,运行结果应该是:第4、11、14条目显示的是同一种类型布局,第6、9、21条目显示的是另一种类型布局,其它条目显示的又是另一种类型布局。
十、设置空布局
- 设置空布局就一个方法,但是我还是单独放在一个章节里来讲也是有原因的:
1、在我写demo的时候,设置空布局时就碰上一个bug,即使我所有的布局中的相关控件高度都设置成填充父窗体,但是显示时并没有填充整个界面,而仅仅是包裹内容;
2、但是当我在我现在开发的项目中设置空布局时又确实是填充整个父窗体,这就让我很迷惑了,狂躁了好久,看了好多次demo代码也没找到原因,最后还是没有找到原因.......
3、当然,因为我也是一个Android新人,有很多地方我都需要继续努力学习,或许只是一个很简单、很低级的错误导致没有填充父窗体,如果看到这篇文章的朋友你也遇到过相似的问题,而且又正好知道原因,还希望你能多多指教。
十一、添加拖拽、滑动删除
- adapter需要继承BaseItemDraggableAdapter:
- 默认不支持多个不同的 ViewType 之间进行拖拽,如果开发者有所需求:
重写 ItemDragAndSwipeCallback 里的onMove()方法,return true即可
十二、树形列表
- adapter需要继承BaseMultiItemQuickAdapter
十三、自定义ViewHolder
- 然后修改adapter的第二个泛型为自定义的ViewHolder
- 注意:需要单独建一个外部类继承BaseViewHolder,否则部分机型会出现ClassCastException,如果是内部类的构造方法要是public,定义的那个类也最好是public。
十三、扩展框架