灵活且强大的RecyclerViewAdapter源码分析

虽然工作可以不涉及编码,但是本着对编码的热爱,于是在业余时间写了一个关于RecyclerViewAdapter高度定制的开源库。

相信大家RecyclerView应该不会陌生,大多数开发者应该都使用上它了,它也是google推荐替换ListView的控件,但是用过它的同学应该都知道它在某些方面并没有ListView使用起来方便,需要我们额外的编写代码,今天就给大家介绍一个Github上面的一个开源库,有了它让你使用RecyclerView的时候,和ListView一样的好用!它的名字叫做「BaseRecyclerViewAdapterHelper」,直接输入「www.recyclerview.org」可以直接访问。接下来不仅仅要给大家介绍它能做什么,还要分析它的原理是如何实现。

节省Adapter大量代码量

效果

如此的复杂布局!

代码使用

赋值代码不过10行!

原理分析

找到重复部分代码,抽取到基类,非重复部分用抽象方法代替,具体让子类实现。
我们可以从上面的代码块中看到,他继承了BaseQuickAdapter,其实BaseQuickAdapter重写了重复的代码,根据java的继承特性,儿子继承爸爸的财产,所以儿子很轻松,做的事情很少。

BaseQuickAdapter

接下来我们再来看看关于赋值的BaseViewHolder

viewHolder

它里面做了一个缓存机制,避免了重复加载view,把常用的set方法全部写好了,但是需要注意加载网络图片这一块需要开发者自己加载,因为考虑到实战项目中都有自己的图片加载库,如果封装在里面就耦合了,不能强迫所有的开发者都使用框架内置的图片加载库,所以在使用的代码块里面,我们可以看到它是通过一个getView的方法拿到imageView对象再去通过自己的常用图片加载框架去做相应的图片加载。

添加点击事件

RecyclerView没有ItemClick方法,可以在上面提过的BaseQuickAdapter里面添加ItemClick,网上有很多写法都是在onBindViewHolder
里面写,功能是可以实现但是会导致频繁创建,应该在onCreateViewHolder()
中每次为新建的 View 设置一次就行了。如果想添加长按事件,也同理。

代码使用

原理分析

列表加载动画

效果

列表加载动画

代码使用

原理分析

关于开启动画

首先判断是否开启动画,然后判断是否是自定义动画还是用户选择的自带动画,然后对动画的操作元素进行遍历执行,执行时间为300毫秒,由于上面说了每次填充数据都会调用,所以如何不判断的话,就会导致上下滑动每次都会重复调用动画,动画本身是会耗费性能的。

控制加载次数

只需要添加一个mLastPosition来存储滑动过的位置,然后判断滑动的位置是否被滑动过,这样就可以避免每次都添加动画了。不过为了满足喜欢动画多过于性能的开发者,如果你想要每次滑动都带动画可以设置isFirstOnly属性即可,默认是不开启的。

添加头部尾部

效果

使用代码

原理分析

实际上就定义多个不同类型的布局

  1. 重写getItemViewType()方法,根据需求规则给出不同的type值。

  2. 在onBindViewHolder()里面根据不同holder的类型来赋予相对于的数据

  3. 如果有额外布局(如:头部尾部)需要修改getItemCount()方法的返回数量

添加头部和尾部(额外布局)

在上面的基础之上再重写getItemCount()在原本数据量上加上根据额外布局的数量,代码如下

注意:如果是添加头部
那就必须在原onBindViewHolder()
里面position-头部数量,因为不减去的话,那么数据就会从第二条开始遍历,所以要注意!

篇幅有限,今天就介绍到这里,除了这些功能还有更多实用功能!项目持续更新中,觉得对自己有帮助的朋友可以star一下

最后奉上github源码地址:https://github.com/CymChad/BaseRecyclerViewAdapterHelper