程序员人生 网站导航

[置顶] 灵活且强大的RecyclerViewAdapter源码分析

栏目:综合技术时间:2016-08-24 08:30:16

我的简书地:http://www.jianshu.com/users/f958e66439f0/latest_articles

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

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

节省Adapter大量代码量

效果

如此的复杂布局!

代码使用

赋值代码不过10行!

原理分析

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

BaseQuickAdapter

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

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

添加点击事件

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

代码使用

原理分析

列表加载动画

效果

列表加载动画

代码使用

原理分析

关于开启动画

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

控制加载次数

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

添加头部尾部

效果

使用代码

原理分析

实际上就定义多个不同类型的布局
1. 重写getItemViewType()方法,根据需求规则给出不同的type值。
2. 在onBindViewHolder()里面根据不同holder的类型来赋予相对的数据
3. 如果有额外布局(如:头部尾部)需要修改getItemCount()方法的返回数量

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

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

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

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

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

------分隔线----------------------------
------分隔线----------------------------

最新技术推荐