灵活且强大的RecyclerViewAdapter源码分析
今天周三,来自 陈宇明 的文章给大家推荐了一个RecyclerView适配开源库,这里我就不做赘述,详细的功能阅读正文即可。
陈宇明 的博客地址:http://www.jianshu.com/users/f958e66439f0
相信大家对RecyclerView应该不会陌生,大多数开发者应该都使用上它了,它也是google推荐替换ListView的控件,但是用过它的同学应该都知道它在某些方面并没有ListView使用起来方便,需要我们额外的编写代码。
今天就给大家介绍一个Github上面的一个开源库,有了它让你使用RecyclerView的时候,和ListView一样的好用!它的名字叫做 BaseRecyclerViewAdapterHelper,地址:
www.recyclerview.org
接下来不仅仅要给大家介绍它能做什么,还要分析它的原理是如何实现。
效果:
代码使用(赋值代码不超过10行):
原理分析:
找到重复部分代码,抽取到基类,非重复部分用抽象方法代替,具体让子类实现。
我们可以从上面的代码块中看到,他继承了 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一下!
如果你有好的技术文章想和大家分享,欢迎向我的公众号投稿,投稿具体细节请在公众号主页点击“投稿”菜单查看。
欢迎长按下图 -> 识别图中二维码或者扫一扫关注我的公众号: