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

代码使用

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

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

它里面做了一个缓存机制,避免了重复加载view,把常用的set方法全部写好了,但是需要注意加载网络图片这一块需要开发者自己加载,因为考虑到实战项目中都有自己的图片加载库,如果封装在里面就耦合了,不能强迫所有的开发者都使用框架内置的图片加载库,所以在使用的代码块里面,我们可以看到它是通过一个getView的方法拿到imageView对象再去通过自己的常用图片加载框架去做相应的图片加载。
添加点击事件
RecyclerView没有ItemClick方法,可以在上面提过的BaseQuickAdapter里面添加ItemClick,网上有很多写法都是在onBindViewHolder
里面写,功能是可以实现但是会导致频繁创建,应该在onCreateViewHolder()
中每次为新建的 View 设置一次就行了。如果想添加长按事件,也同理。
代码使用

原理分析

列表加载动画
效果

代码使用

原理分析

关于开启动画
首先判断是否开启动画,然后判断是否是自定义动画还是用户选择的自带动画,然后对动画的操作元素进行遍历执行,执行时间为300毫秒,由于上面说了每次填充数据都会调用,所以如何不判断的话,就会导致上下滑动每次都会重复调用动画,动画本身是会耗费性能的。
控制加载次数
只需要添加一个mLastPosition来存储滑动过的位置,然后判断滑动的位置是否被滑动过,这样就可以避免每次都添加动画了。不过为了满足喜欢动画多过于性能的开发者,如果你想要每次滑动都带动画可以设置isFirstOnly属性即可,默认是不开启的。
添加头部尾部
效果

使用代码

原理分析
实际上就定义多个不同类型的布局
- 重写getItemViewType()方法,根据需求规则给出不同的type值。
- 在onBindViewHolder()里面根据不同holder的类型来赋予相对于的数据
- 如果有额外布局(如:头部尾部)需要修改getItemCount()方法的返回数量
添加头部和尾部(额外布局)
在上面的基础之上再重写getItemCount()在原本数据量上加上根据额外布局的数量,代码如下

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

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

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