史上最全的使用RecyclerView实现下拉刷新和上拉加载更多

article/2025/9/18 1:46:07

前言:

           纵观多数App,下拉刷新和上拉加载更多是很常见的功能,但是谷歌官方只有一个SwipeRefreshLayout用来下拉刷新,上拉加载更多还要自己做。

     本篇文章基于RecyclerView简单封装了这两个操作,下拉刷新支持LinearLayoutManager、GridLayoutManager和StaggeredGridLayoutManager;上拉加载更多只支持前两者。
 

概述:

关于此篇文章,你需要提前了解:
1.实际项目开发过程中,能使用到下拉刷新和上拉加载更多功能的往往都和网络请求有关,即,下拉刷新和上拉加载更多需要有后台服务器的支持。

2.不管是下拉刷新还是上拉加载更多,本质上都是通过监听事件的触发而已。

3.如果是单纯的只是使用下拉刷新(不使用上拉加载更多),我们完全可以在每次触发下拉刷新操作时,直接将从后台服务器上请求下来的数据全部通过RecyclerView+Adapter进行展示即可,无须分页,也无须规定当前页展示多少条数据。

		//伪代码.....mListData.clear();mListData.addAll(value.getResults());adapter.notifyDataSetChanged();.........

但是如果项目中同时集成下拉刷新和上拉加载更多的话,则不管是下拉刷新还是上拉加载更过的接口中必然要涉及一下两个重要的参数:

parm 1:每页请求的数据 
parm 2:当前页数

原因很简:如果不设置这两个参数的话,在进行下来刷新时完全可以将所有的数据一起展示,上拉时也就不会触发什么加载更多的操作了。
 

说在前面:

之前想研究下拉刷新和上拉加载更多的示例代码。从网上找了好多,关于上拉加载更多的逻辑存在各种各样bug,简单有下面几类:

1.简单的模拟,没有后台服务器支持,逻辑走不通。
2.在上拉加载更多的最后的一个item的处理上存在逻辑混乱。虽然尝试做了更改,仍然不能使其正常运行。
3.对数据请求失败的处理不完善。
4.不支持GridLayoutManager对应的多行多列的实现。

好在老天有眼,终于找到一个比较完善的示Demo,如下:
手把手教你实现RecyclerView的下拉刷新和上拉加载更多

        其中讲述了下拉刷新和上拉加载更多的使用步骤,以及需要重点关注的逻辑。因此本文就不再赘述其中上述博客已经存在的使用步骤,而是从项目结构的角度帮助大家更好理解和实现对上拉加载更多功能。
 

效果演示:

上图说话:
在这里插入图片描述

说在中间:

在分析项目结构之前呢,先把项目中用到相关知识点或者模式跟大家罗列一下,如果大家对列举的这些内容都已经了解或者已经掌握,则可以继续往下看,如果好多知识你都不曾接触过。那么你继续往下看的话会感到很迷茫,看不懂。(哈哈,有句话说的好,当你感到迷茫的时候,正是促使你学习的最佳时机,不要多想,行动起来吧。)

本项目用到的知识点罗列:
1.项目中用到的设计模式是标准的MVP模式(Model-View-Presenter)。
mvp速学通道:MVP模式使用示例详解

2.Rxjava+Retrofi实现网络请求
速学通道:
(1).Android Retrofit 2.0 的详细 使用攻略(含实例讲解)
(2).彻底搞清楚 RxJava 是什么东西
(3).分分钟使用Retrofit+Rxjava实现网络请求

3.ButterKnife.
ButterKnife是一个专注于Android系统View的注入框架,让你从烦人的findViewById中解脱出来。项目中使用的是版本比较老的ButterKnife,所以在获取控件实例时候,的注释字段可能会有些区别,eg.老本本使用的是InjectView,新版本使用的是bindView。这个比较简单。
速学通道:Android Butterknife使用方法总结

        好了,上面列举的就是本项目中用到的且会影响到代码研读的知识点,提前先列出来。如果对上面的知识点有了基本的认知或者更深入的理解,才可以进入到下一步。

        顺便说一下,上面列举的相关知识点,也是目前进行进行android项目开发时用到的最新最热的知识点。不要感觉这些东西很超前,相反,他们已经出来好几年了。霍霍,是不是意识到了点什么。。。。。
 

项目结构与分析:

在这里插入图片描述

分析:

adapter包:

1.AdapterWrapper.java


/*** 1. 显示或隐藏"滑动加载更多条目"* 2. 设置"滑动加载更多条目的状态"  提示加载或正在加载* 3. 末尾item由wapper添加, 其他item由原生adapter添加* 4. 隐藏"滑动加载更多条目"时, item数量减1* 5. 更新操作调用原生adapter的notifyDataSetChanged()* 6. 不支持StaggeredGridLayoutManager*/public class AdapterWrapper extends RecyclerView.Adapter {
..........
........... 

2.GankNewsAdapter.java

/*** "干货"/"福利"的adapter适配器*/
public class GankNewsAdapter extends RecyclerView.Adapter<GankNewsAdapter.MyViewHolder> {
..........
........... 

3.GankViewPagerAdapter.java

/*** 用于fragment中"android干货"和“福利”tab的切换的适配器*/
public class GankViewPagerAdapter extends FragmentPagerAdapter {
..........
........... 

 

bean包:

1.GankNewsBean.java

/*** 用于展示“android干货”的实体类对象*/
public class GankNewsBean implements Serializable {/*** 使用Gson解析json成对象时默认的是将json里对应字段的值解析到java对象里对应字段的属性里面*/@SerializedName("desc")private String mDesc;@SerializedName("images")private List<String> mImages;@SerializedName("publishedAt")private Date mPublishedAt;@SerializedName("url")private String mUrl;public String getDesc() {return mDesc;}public List<String> getImages() {return mImages;}public Date getPublishedAt() {return mPublishedAt;}public String getUrl() {return mUrl;}
}

2.GankResponseBean.java

/*** 封装的Retrofit返回的数据类* 使用Gson解析json成对象,默认的是将json里对应字段的值解析到java对象里对应字段的属性里面*/
public class GankResponseBean implements Serializable {@SerializedName("results")private List<GankNewsBean> mResults;public List<GankNewsBean> getResults() {return mResults;}}

 

contract包:

1.GankContract.java

/*** Presenter层接口---控制Model层的数据操作及调用View层的UI操作来完成“中间人”工作*/
public interface GankContract {/*** 用于view(Activity或者Fragment)中进行的ui操作*/interface View {void setPageState(boolean isLoading);void setListData(List<GankNewsBean> listData);void onRefreshComplete();void onLoadMoreComplete();void onInitLoadFailed();}/*** Presenter是连接model和view的纽带,因此其要提供获取model的接口*/interface Presenter {void onViewCreate();void onRefresh();void onLoadMore();}
}

2.GankPresenter.java

/*** GankPresenter是连接view和model的纽带,此处职能:通过view的调用去初始化view的相关逻辑,* 同时调用mode的相关接口去获得数据,并将数据返回给presenter*/
public class GankPresenter implements GankContract.Presenter {
.............
.............

3.GankURLService.java

/*** 使用Rxjava和Retrofit封装的数据请求接口*/
public interface GankURLService {String BASE_URL = "http://gank.io/api/";@GET("data/{category}/{pagecount}/{page}")Observable<GankResponseBean> requestData(@Path("category") String category,@Path("pagecount") int countPerPage,@Path("page") int page);
}

4.NullOnEmptyConverterFactory.java

/*** 上面两个接口从服务端获取了数据,通过GsonConverterFactory将服务端相应内容解析成对应的实体类。* 在接口正常响应时(有数据返回),并没有什么异常发生,但当接口请求的数据为空,我们的服务端人员并不是返回理论意义上的空,* null或者[](数据集合空),而是返回没有响应体body,只有响应头header,content-length为0的Response*/
public class NullOnEmptyConverterFactory extends Converter.Factory {@Overridepublic Converter<ResponseBody, ?> responseBodyConverter(Type type, Annotation[] annotations, Retrofit retrofit) {final Converter<ResponseBody, ?> delegate = retrofit.nextResponseBodyConverter(this, type, annotations);return new Converter<ResponseBody, Object>() {@Overridepublic Object convert(ResponseBody body) throws IOException {if (body.contentLength() == 0) return null;return delegate.convert(body);}};}
}

        好了,主程序代码就不贴出来了,大家通过上面的项目结构先对整体功能结构划分有个了解。然后大家结合本项目的原来出处::::

手把手教你实现RecyclerView的下拉刷新和上拉加载更多
去学习如何应用把。记住多查,多学,多问!
 

说在最后:

        文章最后,我会贴出此项目的示例源码。我在原来示例的基础上,添加了更为详细的注释,同时也对原来示例源码中描述明显有误的地方做了修改。当然了,你也可以直接下载原来博文中的源码示例。重点是要好好分析。
源码中有些比较难理解的地方,可能一时半会理解不过来。没关系,一步步来:
1.先学会如何使用,做到稍加修改就能满足自己的项目需求。
2.在今后再次遇到下拉刷新和上拉加载更多的需求的时候,继续研究。相信随着研究的深入以及相关问题的不断解决。我们一定能完全消化,化为己用。

 

示例代码下载:

https://download.csdn.net/download/zhangqunshuai/10703613

         好了,至此完结,同时感谢原示例代码作者,小伙伴如果有疑问请留言,愿我们相互探讨,共同进步。


http://chatgpt.dhexx.cn/article/jowJ4tpw.shtml

相关文章

一种Flutter加载更多的实现方法

转载注明出处&#xff1a;https://blog.csdn.net/skysukai 1、why flutter&#xff1f; 我们在进行Android开发的时候&#xff0c;比如布局文件&#xff0c;会创建一个xml来存放布局。写熟悉了觉得没什么&#xff0c;可是&#xff0c;用xml来存放布局文件是十年前的技术了。在…

Android BaseRecyclerViewAdapterHelper上拉加载更多

private boolean isErr false; //是否加载错误 private int TOTAL_COUNTER 16; //一共模拟加载16条数据&#xff0c;所有的数据总数 private int mCurrentCounter 6; //当前的数据总数&#xff0c;因为第一次默认加载6个//1.上拉加载mImgDetailsAdapter.setOnLoadMoreListen…

使用SmartRefreshLayout下拉刷新框架实现加载更多

使用 SmartRefreshLayout 可以实现recyclerview的下拉刷新和上拉加载更多&#xff0c;但是有时候在使用上拉加载更多时&#xff0c;不同的json格式需要不同的判断方法 1、后台根据每次相加的totalElements的个数作为请求的参数即pageSize12 pageNo1 {"content":[{…

Android recyclerview上拉加载更多

记录一下视频列表&#xff08;recyclerview&#xff09;上拉显示一个“加载更多”的item&#xff0c;然后加载数据。 效果图&#xff1a; 实现思路&#xff1a; 1.写两个item布局&#xff0c;一个用来展示数据&#xff0c;一个用来展示加载中也就是滑到最下方的时候显示的“…

vue 点击加载更多

然后按照需求一步步来&#xff0c;先写基本页面 如果不想看过程&#xff0c;直接去后面完整代码那就可以 <template><div><div><div class"Journalism" ref"div"><div v-for"item in todos" :key"item.id&quo…

uniapp实现点击加载更多

使用场景 举个栗子&#xff1a;外卖app当订单商品数量比较多时&#xff0c;不方便一次性展示出来。通常会展示一部分&#xff0c;并在页面给出一个查看更多功能。点击后即可自定义展示剩余内容&#xff0c;比如可以每次点击多展示N个内容&#xff0c;或展示所有。 实现效果 实…

RecyclerView系列之加载更多

一、背景 很久很久以前简单封装过一次RecyclerView&#xff0c;后来一直开发TV端&#xff0c;列表的需求花样不是很多&#xff0c;主要是解决TV端各种兼容问题&#xff0c;也没怎么琢磨这个美丽的控件了&#xff0c;现在打算重新整理一下&#xff0c;其实网上已经有很多优秀的开…

js页面中实现加载更多功能

分页-如何实现加载更多功能&#xff0c;目前的在很多网站上使用的加载更多功能中&#xff0c;使用最多的是iscroll.js实现的上拉加载更多、下拉刷新功能。但是iscroll.js本身并没有集成加载更多的功能&#xff0c;需要进行自行扩展。 最简单的就是给一个加载更多的按钮&#xf…

微信小程序之加载更多(分页加载)实例

1.业务需求&#xff1a;列表滚动到底部时&#xff0c;继续往上拉&#xff0c;加载更多内容 2.必传参数&#xff1a; &#xff08;1&#xff09;page: 1 //第几次加载 &#xff08;2&#xff09;limit: 5//每次加载的显示数据条数 &#xff08;3&#xff09;total: null //需要返…

自己收藏整理的一些操作系统资源

在CSDN混迹这么多年 感觉在技术宽度和广度都深不可测的C站 Windows方面的技术相对较少一些 今天&#xff0c;借着寻找C站宝藏的活动 介绍一些C站宝藏的 Windows相关资源技术专栏 附带一下猎奇操作系统的资源~~~ 【操作系统资源&#xff1a;吐血整理&#xff0c;建议收藏&a…

写代码爬取了某 Hub 资源,只为撸这个鉴黄平台!

黄色已经是我们所不容然而却防不胜防的&#xff0c;尤其是对于做内容的工具和平台&#xff0c;所以花了30分钟搭建了一个鉴黄平台&#xff0c;分享给大家。 &#xfeff; 数据准备 &#xfeff; 找了 N 多资源都不能解决问题&#xff0c;于是怒爬某 Bub资料&#xff0c;备用…

QGC(QGroundControl)地面站手把手教你改——高德地图的添加和瓦片地图在线资源

如何添加高德地图和瓦片地图在线资源 1. 演示效果2. 代码添加3. 瓦片地图在线资源3.1 高德地图3.2 天地图3.3 其它地图源相关链接 所有的热爱都要不遗余力&#xff0c;真正喜欢它便给它更高的优先级&#xff0c;和更多的时间吧&#xff01; 关于QGC地面站其它文章请点击这里: …

系统硬件资源测算

上一篇写到了架构在规划时&#xff0c;应该做哪些&#xff1f;当项目启动后&#xff0c;资源的需求就会提上议程&#xff0c;包括人力资源、项目所需的软件资源、硬件资源以及其他资源。而今天想探讨的是很少被触及的硬件资源。因为硬件资源的规划往往都是经验值的积累&#xf…

在线学习Java的资源网站

CodeGym&#xff08;https://codegym.cc/&#xff09;&#xff1a;一个在线Java编程课程&#xff0c;80%的内容是练习&#xff0c;适合一窍不通的入门者。 CodeAcademy&#xff08;https://www.codecademy.com/&#xff09;&#xff1a;该课程注重的是在找工作时非常有用的技术…

RTSP在线视频流资源地址

在线视频流地址&#xff1a; rtsp://wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_115k.mov 真机显示界面: 模拟器显示界面: 学好一门语言&#xff0c;动手去练&#xff0c;半天上手&#xff0c;一星期炉火纯青。—— 专攻无人车的学长

在线地图资源

一、ARCGIS在线地图资源 1&#xff0c;全球服务地址目录&#xff1a; http://services.arcgisonline.com/arcgis/rest/services 影像&#xff1a; http://services.arcgisonline.com/arcgis/rest/services/World_Imagery/MapServer?fjsapi 电子地图&#xff1a; ht…

【ArcGIS微课1000例】0025:ArcGIS Online当前未连接到在线资源终极解决办法

ArcGIS Online在线资源列表: World Imagery: 底图服务: 中国地图彩色版: 打开ArcGIS时,系统托盘提示“ArcGIS Online当前未连接到在线资源”,如下图所示,如果无法连接到ArcGIS Online,则就无法添加在线资源,如World Imagery等。 关于该问题,网上有多种解决办法,然而…

赶紧收藏3个免费在线资源齐全的网站

非搜 是一个综合搜索网站&#xff0c;能同时获得多个网站上的搜索结果展示&#xff0c;在APP上用户也能自己添加网站&#xff0c;除了看所有影视&#xff0c;还有小说&#xff0c;漫画&#xff0c;招聘&#xff0c;搜索&#xff0c;等搜索类型。 优点&#xff1a;不光包含影视…

arcgis当前未连接到在线资源

显示 arcgis当前未连接到在线资源时图标会打叉&#xff0c;一般按步骤破解的都没问题&#xff0c;这种情况应该是突然出现的&#xff0c;具体原因应该是你下了什么病毒软件或者操作损坏了你的网卡配置&#xff0c;这种缺陷不至于来连不了网&#xff0c;但访问界面可能有异常&am…

8个压箱底的资源网站,一个顶十个,再也不用到处找资源了

分享8个压箱底的资源网站&#xff0c;个个都让人相见恨晚&#xff0c;免费且资源丰富&#xff0c;一个顶几十个&#xff0c;有了它们就有了用不完的资源&#xff01; 1、电子书资源&#xff1a;Libgen 一个超好用的电子书搜索下载网站&#xff0c;里面的资源非常丰富&#xf…