之前在《一步步打造自己的通用上拉加载布局》(如果没有看过,建议先看下这一篇)写到如何实现一个通用的上拉加载布局,本文将基于此进行扩展,实现 RecyclerView 的上拉加载及自动加载。
在之前的《一步步打造自己的通用上拉加载布局》已经提到,下拉刷新是将获取到的数据替换掉原有的数据,而上拉加载则是将获取到的数据插入到原来数据的末尾与底部提示加载的 View(如FooterView)之间,它们的展现方式的不同,使得上拉出来用于提示加载的 View,对于列表类视图如 ListView
或 RecyclerView
而言,适合作为它们的 FooterView 而不适合封装到我们的上拉布局中。因此,我们需要继承 LoadMoreLayout
并实现对于 RecyclerView
的扩展。
准备工作
由于在 LoadMoreLayout
中已经把上拉的逻辑都封装好,因此这里主要是对 RecyclerView
的 FooterView
及自动加载的封装。在这里,对于带 FooterView
的 Adapter,我是通过包装原有的 Adapter 来实现,这样在使用的时候就不需要把原来的 Adapter 改成我们的上拉加载中的 Adapter,以减少对代码的侵入。这个 Adapter 代码如下。这个类代码可不必细看,它是上拉加载的副产品,不是主要逻辑,于这里贴出只是交底。
1 | /* |
接下来,继承自这个 Adapter,实现对 FooterView 添加,代码如下:
1 | /* |
然后,实现一个默认的 FooterView
。它的布局文件很简单,就是一个 TextView
,如下:
1 | <?xml version="1.0" encoding="utf-8"?> |
它需要实现 LoadMoreUIHandler
接口,Java 代码如下:
1 | /* |
上拉加载的 FooterView 扩展
前面这些,都只是对 FooterView 显示的准备工作。最后,才是对 LoadMoreLayout
实现支持 RecyclerView 的扩展。如果你不需要这个FooterView,那么直接使用 LoadMoreLayout
也是可以的。当然,这里的扩展过程也很简单,继承 LoadMoreLayout
,然后重写 protected void onFinishInflate()
方法,限定子 View 只能是 RecyclerView,再定义一个设置 FooterView 的方法,如此即可,代码如下:
1 | /* |
这就完成了上拉加载的扩展。
实现自动加载
接下来实现自动加载,这个也很简单,思路就是监听 RecyclerView
的滚动,如果到达底部,则主动触发上拉加载。这里只需要定义一个表示是否需要自动加载的成员变量,添加其 setter 方法,然后修改上面重写的 protected void onFinishInflate()
方法,给 RecyclerView 加一个监听器即可,如下:
1 |
|
这样就扩展完成了。
使用示例
以上代码已提交至 Github 上的 hi-loadmore 项目,并且已发布至 bintray。使用方式如下:
首先添加 Gradle 依赖:
1 | compile 'com.githang:hi-loadmore:0.1.1' |
然后在布局中使用 LoadMoreRecyclerViewContainer
作为 RecyclerView
的父布局。接下来在 Java 代码中添加配置:
1 | RecyclerFooterView footerView = new RecyclerFooterView(this); |
然后设置触发了上拉加载后的处理:
1 | mLoadMoreLayout.setLoadMoreHandler(new LoadMoreHandler() { |
最后看运行结果: