打赏

记录adapter

开源框架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

  • 要是刚接触Android的朋友要是还是不知道怎么用,那我这里提供一个很简单的demo:

  • 比如说我想要实现的效果大致如下:


     
  • 第一步:在布局文件中引入RecyclerView
    activity_main.xml

  • 第二步:编写条目布局文件
    item_rv.xml
  • 第三步:编写数据实体类型
    Model.java
  • 第四步:编写适配器
    MyAdapter.java
  • 最后一步:在Activity中使用该适配器
    MainActivity.java
  • OK,运行,得到的效果就是上述的效果。

三、点击事件

  • 上文中描述的就是使用BaseRecyclerViewAdapterHelper最基本的用法,因为怕刚接触Android的兄弟们不明朗或不相信这么简单的用法,所以做了上节简单的demo示例用法。

  • 那么使用列表当然少不了点击事件,不论是整个条目的点击事件还是条目中子控件的点击事件,该适配器对点击事件也是做了及简化的处理:

3.1 条目事件

Item的点击事件

       

Item的长按事件

      
注意事项
  • 在嵌套recycleView的情况下需要使用你使用 adapter. setOnItemClickListener 来设置点击事件,如果使用recycleView.addOnItemTouchListener会累计添加的。

3.2 条目子控件事件

Item子控件的点击事件

  • 首先:在adapter的convert方法里面通过 helper.addOnClickListener 绑定一下子控件的控件id
   
  • 然后:我们设置
      

Item子控件的长按事件

  • 这里和子控件点击事件是一样的,只是将 点击 变成 长按 就可以了

  • 首先:在adapter的convert方法里面通过 helper.addOnLongClickListener 绑定一下子控件的控件id

   
  • 然后:我们设置
      
注意事项
  • 设置子控件的事件,如果不在adapter中绑定,点击事件无法生效,因为无法找到你需要设置的控件。

多个Item子控件事件

  • 官方文档上没说,但是 其实这里可以用很常规的方法处理,就是通过判断ID来判定是否是我要的控件?,从而处理不同的事件

  • 比如我这里给 图片和标题 都加点击事件处理不同的逻辑

  • 首先:当然是在适配器中给图片和标题都添加点击事件

  • 其次:
       
  • 那么如果是长按事件呢?当然也是相同的处理方法。

如果需要在子控件事件中获取其他子控件可以使用:

比如:

      

注意:如果有header的话需要处理一下position加上 headerlayoutcount。

  • 最后,到这里,点击事件基本就完了

四、添加列表加载动画

  • 给条目添加动画也是比较常见的需求

  • 开启动画(默认为渐显效果)

  • 该适配器提供了5种动画效果(渐显、缩放、从下到上,从左到右、从右到左)
  • 更换动画效果
  • 如果想自定义动画,该适配器也提供了接口
       
  • 注意:动画默认只执行一次,如果想重复执行可设置
  • 设置不显示动画数量(老实讲,我没明白这个方法的效果是啥,因为我并没有看到效果 0.0)
  • 首次到界面的item每次都依次执行加载动画

由于进入界面的item都是很多的速度进来的所以不会出现滑动显示的依次执行动画效果,这个时候会一起执行动画,如果觉得这样的效果不好可以使用setNotDoAnimationCount设置第一屏item不执行动画,但是如果需要依次执行动画可以重写startAnim让第一个屏幕的item动画延迟执行即可。

五、添加头部、尾部

  • 添加
    (可以添加多个头部或尾部)
  • 删除指定view
  • 删除所有
  • 默认出现了头部就不会显示Empty,和尾部,配置以下方法也支持同时显示:
  • 默认头部尾部都是占满一行,如果需要不占满可以配置:

六、上拉加载

  • 没错,该适配器居然还实现了加载更多的功能,真心佩服作者

  • 设置上拉加载

  • 默认第一次加载会进入回调,如果不需要可以配置:
  • 回调处理代码
  • 加载完成(注意不是加载结束,而是本次数据加载结束并且还有下页数据)
  • 加载失败
  • 加载结束

注意:如果上拉结束后,下拉刷新需要再次开启上拉监听,需要使用setNewData方法填充数据。

  • 打开或关闭加载(一般用于下拉的时候做处理,因为上拉下拉不能同时操作)
  • 预加载(这个功能屌炸天)

设置自定义加载布局

七、下拉加载(符合聊天软件下拉历史数据需求)

1、这里的下拉加载我个人觉得不好用,并不像我们常用的那种下拉加载(当然有可能是我没有合理使用)
2、所以如果是需要下拉刷新的功能,我个人会使用SwipeRefreshLayout

  • 设置开启开关

  • 设置监听


开始加载的位置

八、分组布局

  • 由于我还没碰到过这样的需求,所以对 分组布局 这个概念还不是很了解;

  • 当然,我对概念都不知道,所以也不知道是什么样的效果,当然也就没有写demo(主要是时间问题)。

  • 以下是正文

  • 实体类必须继承SectionEntity:

  • adapter构造需要传入两个布局id,第一个是item的,第二个是head的,在convert方法里面加载item数据,在convertHead方法里面加载head数据:

九、多布局

  • 多种类型条目的列表是我们日常开发中非常常见的功能,当然该适配器也给我们提供了相应的方法。

  • 使用该适配器设置不同类型条目有两种方式,一种 耦合了实体类,一种是设置代理,这里两种方式我都会演示一遍。

9.1 实现MultiItemEntity的方式

  • 实体类必须实现MultiItemEntity,在设置数据的时候,需要给每一个数据设置itemType
  • 在适配器构造函数里面addItemType绑定type和layout的关系
  • 如果考虑到在GridLayoutManager复用item问题可以配置
  • 如果使用多布局出现这个NotFoundException异常,有可能是addItemType()两个参数写反了。

  • 以上就是官方文档给出的多布局设置方式的介绍,可能对于像我这样Android小白会看的一脸懵逼,所以我写了一个很简单的Demo方便理解。

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:
  • Activity使用代码:
  • 默认不支持多个不同的 ViewType 之间进行拖拽,如果开发者有所需求:

重写 ItemDragAndSwipeCallback 里的onMove()方法,return true即可

十二、树形列表

  • 本人表示不想贴出demo了,因为我没尝试着写demo试试,看文档说明感觉和多布局貌似是一个套路....(感觉是...)

  • 例子:三级菜单

  • adapter需要继承BaseMultiItemQuickAdapter
  • 开启所有菜单:
  • 删除某一个item(添加和修改的思路是一样的)

十三、自定义ViewHolder

  • 需要继承BaseViewHolder
  • 然后修改adapter的第二个泛型为自定义的ViewHolder
  • 注意:需要单独建一个外部类继承BaseViewHolder,否则部分机型会出现ClassCastException,如果是内部类的构造方法要是public,定义的那个类也最好是public。
     

十三、扩展框架

posted @ 2021-11-23 14:41  张学涛  阅读(160)  评论(0编辑  收藏  举报