美文网首页android程序猿安卓开发
灵活且强大的RecyclerViewAdapter源码分析

灵活且强大的RecyclerViewAdapter源码分析

作者: 陈宇明 | 来源:发表于2016-06-29 08:18 被阅读7894次

    虽然工作可以不涉及编码,但是本着对编码的热爱,于是在业余时间写了一个关于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

    相关文章

      网友评论

      • ghjjjhghh:你们这个能做树形图不 层级不确定的 可能超过三四层
        陈宇明:@2fb2f6cf4922 可以呀
      • Nightsong:下拉刷新还要自己写,不方便。要是像xrecylerview那样就好了
        陈宇明:@Nightsong 可以直接用呀
        Nightsong:@陈宇明 哦。后来我自己封装了下谷歌的下来刷新,我看github上说BaseViewHolder要用子类,不能直接用?
        陈宇明: @Nightsong 这是adapter,并不是recyclerview
      • George吴逸云:楼主,目前支持多选择功能吗?
        陈宇明:目前不支持
      • d68b65565274:其实可以写一下详细的使用步骤,对不熟悉的人有帮助作用。文档实在是太简单了。
        陈宇明:@会写代码的猴子 多谢建议,后续会出。
      • 哎呦哥哥QAQ:大神能把git上的源码换成compile引入而不是在项目里添加library么。。好像两个的源码有些不一样,我按git里相同代码写了然而并没有效果。。。
        陈宇明:@哎呦哥哥QAQ 1.9.8是最新版本
      • 工程师milter:良心之作!!有个小问题讨论一下,在retrieveView方法中,view = convertView.findViewById(viewId);一句之后是不是应该再判断一下view是否为null,如果view为null,有可能是传进来的viewId有问题,此时可以给用户合理的提示,告诉他所要填充的view不存在,如果view不为null,再添加进SparseArray中,这样用户体验似乎好点。
        工程师milter:@milter 😜
        陈宇明:@milter 这个可以有,多谢提醒。
      • 捡淑:mark
      • 无极啊无极:666,和listview相比,好处是什么呢?
        无极啊无极:@陈宇明 好的,O(∩_∩)O谢谢!
        陈宇明:@无极啊无极 你可以看看我的另外一篇文章,《还在用Listview》
      • fb879d10f593:花样推荐的作者←_←
      • leiiiooo:今天下班看看
      • fbd7d5eb43a8:挺详细的,有空看看代码.....

      本文标题:灵活且强大的RecyclerViewAdapter源码分析

      本文链接:https://www.haomeiwen.com/subject/sonmdttx.html