前言
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,但是并没有什么卵用,反而你的加载更多失效了,这又是为什么呢?于是乎抱着钻研的态度去看了看源码,上截图。
大家可以看到先是调用了checkNotNull(),其实就是检查recyclerView是否为空,这个显然不会为空,那么就要看下面的方法了。
大家可以看到,代码其实并不多,为什么加载更多会失效呢?大家看第一行代码,setEnableLoadMore(false),一进来就给你关掉了,再看判断
findLastCompletelyVisibleItemPosition()的返回值永远是你拿到集合的最大索引值,+1刚好与后面的getItemCount()相等,所以setEnableLoadMore(true)永远都不会进,所以加载更多失效。
冲突解决
这上面巴拉巴拉说了一大堆,主要是为了告诉大家出现这个bug的原因。。。少侠,把刀放下,这就给你带来解决思路。
我自己的解决思路,就是把整个界面只留RecyclerView,其他的作为RecyclerView的header,也就相当于删除了ScrollView,当然这也要得益于BaseRecyclerViewAdapter的强大,添加头部,只需要轻轻调用一下addHeaderView()即可,虽然看起来很轻松就解决了,不过我自己却是尝试了很多种解法,都没办法,只有这样才能达到效果,记录一下。当然,如果大家有更好的解法欢迎留言。