美文网首页
BaseRecyclerViewAdapterHelper与Sc

BaseRecyclerViewAdapterHelper与Sc

作者: 李晓通 | 来源:发表于2017-07-27 10:04 被阅读567次

    前言

    Hello,各位小伙伴们大家好啊,明天就是周五了,想想还有点小激动。不过话说回来,激动归激动,文章还是要写的,今天要写的文章是昨天碰到的一个坑,花了一下午的时间才搞定,所以记录一下,如果以后小伙伴们谁碰到了就不用再花那么久了!好了,闲话不多说,进入今天的正题,BaseRecyclerViewAdapterHelper!

    什么是BaseRecyclerViewAdapterHelper

    BaseRecyclerViewAdapterHelper是Github上一个开源项目,其实就是帮你把RecyclerView.Adapter做了一层封装,但是你可以不要小看这一层封装,他能做的事情绝对超乎你的想象,比如

    • 优化Adapter代码

    和原始的adapter相对,减少70%的代码量。

    • 添加Item事件

    Item的点击事件
    Item的长按事件
    Item子控件的点击事件
    Item子控件的长按事件

    • 添加列表加载动画

    一行代码轻松切换5种默认动画。

    • 添加头部、尾部

    一行代码搞定,感觉又回到ListView时代。

    • 自动加载

    上拉加载无需监听滑动事件,可自定义加载布局,显示异常提示,自定义异常提示。同时支持下拉加载。

    • 分组布局

    随心定义分组头部。

    • 多布局

    简单配置、无需重写额外方法。

    • 设置空布局

    比Listview的setEmptyView还要好用。

    • 添加拖拽、滑动删除

    开启,监听即可,就是这么简单。

    • 树形列表

    比ExpandableListView还要强大,支持多级。

    • 自定义ViewHolder

    支持自定义ViewHolder,让开发者随心所欲。

    • 扩展框架

    组合第三方框架,轻松实现更多需求定制。

    至于具体的使用方案我这里就不一一列出了,想使用这个框架的童鞋可以去这个简书地址看看,作者官方的使用文档http://www.jianshu.com/p/b343fcff51b0

    正题

    前面也说了,写这篇文章的目的呢,主要是为了解决一个冲突,那就是当你用ScrollView嵌套RecyclerView的时候,同时你又开启了BaseRecyclerViewAdapter的上拉加载更多setOnLoadMoreListener,那么问题就会出现了,你会发现你的RecyclerView会不停的加载更多,根本停不下来,就像吃了炫迈一样,这里效果不太好演示,我就不截图了,大家如果这样使用的话一定会碰到,那么是为什么呢?

    原因其实很简单,因为你在ScrollView中嵌套RecyclerView的时候,必定会手动计算高度,不然就导致只会显示一行的bug出现,就是因为你手动计算了高度,从而导致BaseRecyclerViewAdapter的加载更多出现了问题,你每一次计算出所有条目的高度,BaseRecyclerViewAdapter就认为你已经准备开始加载下一次数据了,从而形成无限加载更多的问题。

    有些朋友就想了,我看到BaseRecyclerViewAdapter文档里面有一个方法叫disableLoadMoreIfNotFullPage(),作用是不满一屏的时候不会自动加载,确实,我刚开始也是以为调用这个方法就能解决无限加载更多的bug,但是并没有什么卵用,反而你的加载更多失效了,这又是为什么呢?于是乎抱着钻研的态度去看了看源码,上截图。


    disableLoadMoreIfNotFullPage方法源码

    大家可以看到先是调用了checkNotNull(),其实就是检查recyclerView是否为空,这个显然不会为空,那么就要看下面的方法了。


    checkNotNull方法 disableLoadMoreIfNotFullPage方法

    大家可以看到,代码其实并不多,为什么加载更多会失效呢?大家看第一行代码,setEnableLoadMore(false),一进来就给你关掉了,再看判断


    if判断

    findLastCompletelyVisibleItemPosition()的返回值永远是你拿到集合的最大索引值,+1刚好与后面的getItemCount()相等,所以setEnableLoadMore(true)永远都不会进,所以加载更多失效。

    冲突解决

    这上面巴拉巴拉说了一大堆,主要是为了告诉大家出现这个bug的原因。。。少侠,把刀放下,这就给你带来解决思路。
    我自己的解决思路,就是把整个界面只留RecyclerView,其他的作为RecyclerView的header,也就相当于删除了ScrollView,当然这也要得益于BaseRecyclerViewAdapter的强大,添加头部,只需要轻轻调用一下addHeaderView()即可,虽然看起来很轻松就解决了,不过我自己却是尝试了很多种解法,都没办法,只有这样才能达到效果,记录一下。当然,如果大家有更好的解法欢迎留言。

    以上纯属于个人平时工作和学习的一些总结分享,如果有什么错误欢迎随时指出,大家可以讨论一起进步。

    相关文章

      网友评论

          本文标题:BaseRecyclerViewAdapterHelper与Sc

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