android 官方上拉,手把手教你实现RecyclerView的下拉刷新和上拉加载更多

article/2025/10/12 19:34:19

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

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

话不多说先上效果图 数据来自干货集中营

803d3b8cfd7bd24f58565d1e915ad920.gif

(下拉刷新)

b39bcd5ed98f26f18f686a44d50ec7e2.gif

(上拉加载更多 – LinearLayoutManager)

ff47832cffeb50293b21abd28c8ab807.gif

(上拉加载更多 – GridLayoutManager)

(一) 使用方式,很简单 如下:

1. 下拉刷新 3步走

1.1 布局文件

// 用SwipeRefreshLayout包裹RecyclerView

android:id="@+id/gank_swipe_refresh_layout"

android:layout_width="match_parent"

android:layout_height="match_parent">

android:id="@+id/gank_recycler_view"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:overScrollMode="never"/>

1.2 给SwipeRefreshLayout 添加监听 增加触发刷新时的操作(比如重新请求数据)

SwipeRefreshLayout swipeRefreshLayout = findViewById();

swipeRefreshLayout.setOnRefreshListener(new swipeRefreshLayout.OnRefreshListener() {

@Override

public void onRefresh() {

// do something, such as re-request from server or other

}

});

1.3 刷新操作(重新请求数据)完成后要回调来停止隐藏刷新动画(中上方圆形悬浮进度条旋转动画)

swipeRefreshLayout.setRefreshing(false);

至此下拉刷新完成

2.上拉加载3步走

2.1 初始化AdapterWrapper和SwipeToLoadHelper

// adapter是你自己为RecyclerView写的Adapter

RecyclerView.Adapter adapter = new YourOwnAdapter();

AdapterWrapper adapterWrapper = new AdapterWrapper(adapter);

RecyclerView recyclerView = findViewById();

// 将RecyclerView和刚创建的adapterWrapper传入

SwipeToLoadHelper helper = new SwipeToLoadHelper(recyclerView, adapterWrapper);

2.2 设置加载动作触发后的监听

helper.setLoadMoreListener(new SwipeToLoadHelper.LoadMoreListener() {

@Override

public void onLoad() {

// do something, such as request more data from server or other.

}

})

2.3 加载更多内容完成后要回调方法停止动画

helper.setLoadMoreFinish()

至此上拉加载完成 (注意更新数据时要调用AdapterWrapper.notifyDataSetChanged)

(二) 简明扼要的实现思路(上拉加载操作)

RecyclerView的itemView的显示情况分为四种:

第1个可见的(部分显示或者完全显示都算可见)

第1个可见的且是完整的(完全显示算作完整的)

最后1个可见的

最后1个可见的且是完整的

1. 回弹效果

即手指抬起滑动停止,上拉加载更多部分显示时,将上拉加载更多滚动到不显示,使上面挨着它的itemView为最后1个可见且是最后1个完整可见。监听RecyclerView的滚动,当RecyclerView处于SCROLL_STATE_IDLE 状态时,获取最后1个完整可见的itemView:如果是倒数第2个item则计算该item的下边距到RecyclerView底部的距离deltaY,然后将RecyclerView向下滚动deltaY;如果是上拉加载更多则触发加载操作;其他情况不用处理。

// 关键代码 rv : recyclerView

int lcp= layoutManager.findLastCompletelyVisibleItemPosition();

if (lcp == layoutManager.getItemCount() - 2) {

// 倒数第2项

int fcp= layoutManager.findFirstCompletelyVisibleItemPosition();

View child = layoutManager.findViewByPosition(lcp);

int deltaY = rv.getBottom() - rv.getPaddingBottom() -

child.getBottom();

// fcp为0时说明列表滚动到了顶部, 不再滚动

if (deltaY > 0 && fcp!= 0) {

rv.smoothScrollBy(0, -deltaY);

}

} else if (lcp== layoutManager.getItemCount() - 1) {

// 最后一项完全显示, 触发操作, 执行加载更多操作

if (listener!= null) {

listener.onLoad();

}

}

2. 添加底部加载更多itemView

2.1 AdapterWrapper重写了getItemCount方法,保证得到itemView的数量包括加载更多。当是LinearLayoutManager类型时直接加1;当是GridLayoutManager类型时,如果需要则先将列表最后一行填满,再加1。比如:列表每行有3个itemView,最后一行只有1个,这时就需要先加2,再加1,来保证加载更多占据完整的一行。

// 关键代码 其中的adapter为构造函数中传入的原生RecyclerView.Adapter

if (adapterType == ADAPTER_TYPE_LINEAR) {

// 线性布局

return adapter.getItemCount() + 1;

} else {

// 网格布局 spanCount为每行itemView的个数

int remain = adapter.getItemCount() % spanCount; // 余数

if (remain == 0) {

return adapter.getItemCount() + 1;

}

// 余数不为0时,先凑满再加1

return adapter.getItemCount() + 1 + (spanCount - remain);

}

2.2 AdapterWrapper重写了getItemViewType方法,当是最后一个位置时返回ITEM_TYPE_LOAD

// 关键代码

public int getItemViewType(int position) {

// 位置是最后一个时, wrapper进行拦截

if (osition == getItemCount() - 1) {

return ITEM_TYPE_LOAD;// 要避免和原生adapter返回值可能重复

}

// 其他情况交给原生adapter处理

return adapter.getItemViewType(position);

}

2.3 AdapterWrapper重写了onCreateViewHolder方法,当类型为ITEM_TYPE_LOAD时返回加载更多的ViewHolder,其他情况交给原生的adapter处理。

// 关键代码

public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

if (viewType == ITEM_TYPE_LOAD) {

return new LoadMoreHolder();

} else {

return adapter.onCreateViewHolder(parent, viewType);

}

}

2.4 AdapterWrapper重写了onBindViewHolder,这里有三种可能的情况:1. 正常的数据项itemView,交给adapter处理;2. GridView的空白itemView,隐藏处理;3. 底部的加载更多,目前不需要做什么处理。

// 关键代码

public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {

if (position == getItemCount() - 1) {

} else if (position < adapter.getItemCount()){

adapter.onBindViewHolder(holder, position);

} else {

holder.itemView.setVisibility(View.INVISIBLE);

}

}

(三) 额外的两个说明

SwipeFreshLayout有个setEnable(boolean)方法,设置为false的时候就下拉刷新功能就没有了,等同于普通的RecyclerView

同样SwipeToLoadHelper有个setSwipeToLoadEnabled(boolean)方法,设置为false的时候上拉加载功能就没有了, 等同于普通的RecyclerView

如有问题,欢迎指正~

附项目仓库地址,如有需要请自取~

——————— 本文来自 是薛定谔啊 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/u012402124/article/details/78210639?utm_source=copy


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

相关文章

uniapp下拉刷新上拉加载

一、需求 留言板主页&#xff0c;显示所有的留言信息&#xff0c;带有分页功能&#xff1b;上拉加载数据&#xff0c;下拉刷新数据二、代码 1、pages.json 2、messageBoard.vue 用了 uniapp 提供的组件&#xff1a; uni-load-more.vue <uni-load-more :status"load…

jquery 实现上拉加载功能

emmmm&#xff0c;看到了以前自己的写的代码&#xff0c;用jquery实现的上拉加载&#xff0c;顺便修复了以前漏下的bug&#xff0c;感觉可以记录一波。 好的先上图&#xff0c; 好的首先关注console控制台&#xff0c;再来就是右图的内容&#xff0c;页面上初始仅有两个div 接…

微信小程序下拉刷新、上拉加载

微信小程序官方没有给出具体的下拉刷新和上拉加载组件&#xff0c;我们可以基于小程序原生组件scroll-view的扩展与封装,实现简单的上拉加载、下拉刷新组件。 1. 封装组件 // components/customPullDown/index.js Component({options: {multipleSlots: true},properties: {ch…

uniapp局部上拉加载数据

一、页面局部实现上拉加载数据 只有评论区可以上拉加载数据&#xff0c;网上找到了 vue-infinite-scroll二、使用 官方示例 1、 npm 加载依赖 npm install vue-infinite-scroll --save2、 单个页面引用 import infiniteScroll from vue-infinite-scrollexport default {dire…

【Compose】亲手封装一个简单灵活的下拉刷新上拉加载 Compose Layout

Compose 的下拉刷新有现成的 Material 库可以直接使用&#xff0c;非常简单方便。 但是上拉加载目前没看到有封装的特别好的库&#xff0c;Paging 有些场景无法满足&#xff0c;而且上拉加载也是个比较简单的功能&#xff0c;没必要再去依赖一个质量未知的库。我们可以基于目前…

如何实现上拉加载,下拉刷新?

如何实现上拉加载下拉刷新&#xff1f; 实现原理上拉加载下拉刷新 实现原理 上拉加载及下拉刷新都依赖于用户交互 最重要的是要理解在什么场景&#xff0c;什么时机下触发交互动作 上拉加载 首先可以看一张图 上拉加载的本质是页面触底&#xff0c;或者快要触底时的动作 判…

【前端知识之JS】如何实现上拉加载和下拉刷新

前言 本系列主要整理前端面试中需要掌握的知识点。本节介绍如何实现上拉加载和下拉刷新。 文章目录 前言一、介绍二、实现原理1、上拉加载2、下拉刷新 一、介绍 下拉刷新和上拉加载这两种交互方式通常出现在移动端中&#xff1b;本质上等同于PC网页中的分页&#xff0c;只是交…

大数据和人工智能到底是什么关系

大数据和人工智能的关系&#xff0c;首先要说什么是大数据。这些年来&#xff0c;大数据先是被神化&#xff0c;继而又被妖魔化&#xff0c;到了今天&#xff0c;其实谁也不知道别人所谓的大数据指的是什么。有时候大数据的定义里既有平台&#xff08;硬件&#xff09;又有分析…

大数据和人工智能AI的联系和区别

大数据和人工智能两个词是我们现在频繁听到的两个词汇&#xff0c;那么这两者之间到底有什么联系 首先我们要了解到什么是大数据&#xff1f;什么是人工智能&#xff1f;大数据就是一种规模大到在获取、存储、管理、分析方面大大超出了传统数据库软件工具能力范围的数据集合&…

人工智能、机器学习、深度学习 三者关系

目录 1、AI ML DL关系 2、发展历程 2.1、人工智能&#xff08;ArtificiaI Intelligence&#xff09; 2.2、机器学习&#xff08;Machine Learning&#xff09; 2.3、深度学习&#xff08;Deep Learning&#xff09; 1、AI ML DL关系 为了赋予计算机以人类的理解能力与逻辑…

云计算、大数据和人工智能三者到底什么关系

今天跟大家讲讲云计算、大数据和人工智能。为什么讲这三个东西呢&#xff1f;因为这三个东西现在非常火&#xff0c;并且它们之间好像互相有关系&#xff1a;一般谈云计算的时候会提到大数据、谈人工智能的时候会提大数据、谈人工智能的时候会提云计算……感觉三者之间相辅相成…

人工智能和大数据分析之间,主要有什么区别

首先来看看认知计算和人工智能的区别 人工智能的概念已经有二十多年&#xff0c;人工智能从历史和研究角度来讲主要目的是为了让机器表现的更像人类&#xff0c;我们称之为Intelligent Behavior。IBM的认知计算从技术角度上讲和AI是有很多共性的地方&#xff0c;比如机器学习&…

人工智能与大数据的完美结合

人工智能(AI)已经存在几十年了。然而&#xff0c;最近随着“大数据”的出现&#xff0c;它得到了越来越多的关注。维基百科对人工智能的释义如下: 在计算机科学中&#xff0c;人工智能研究的领域将自己定义为“智能代理AI和大数据&#xff1a;完美结合”的研究&#xff1a;任何…

大数据和人工智能的概念

大数据和人工智能的概念 概述大数据和人工智能领域的一些热门趋势。我们将看到世界如何通过数字化而改变&#xff0c;从而导致消费和工业领域的大数据现象&#xff1b;了解到数据量呈指数级增长&#xff0c;从太字节到艾字节再到泽字节&#xff1b;意识到计算机的处理能力增加…

云计算、大数据和人工智能之间的关系

大家好&#xff0c;这里是抖码课堂&#xff0c;抖码课堂专注提升互联网技术人的软硬实力。 这篇文章我们从下面的内容来聊下云计算、人工智能、大数据技术三者之间的关系 探讨什么是云计算&#xff0c;在这里分别探讨云计算的 IaaS、PaaS 以及 SaaS 探讨云计算和大数据技术之…

大数据属于人工智能吗?什么是大数据?

对于“大数据”(Big data)研究机构Gartner给出了这样的定义。“大数据”是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力来适应海量、高增长率和多样化的信息资产。大数据属于人工智能吗&#xff1f;本篇来解答一下这个问题。 大数据属于人工智能吗&#xff…

大数据和人工智能之间,主要有什么区别?

大数据vs.人工智能是一种公平的比较吗?在某种程度上&#xff0c;它是&#xff0c;但首先让我们先厘清它们之间的区别。 人工智能和大数据是人们耳熟能详的流行术语&#xff0c;但也可能会有一些混淆。人工智能和大数据有什么相似之处和不同之处?它们有什么共同点吗?它们是否…

AI和大数据的关系

近几年随着AlphaGO的骄人战绩&#xff0c;人工智能和大数据备受追捧&#xff0c;热度空前。而在实际接触中&#xff0c;大家对人工智能和大数据的认知普遍是“只知其名不知其意”&#xff0c;因此对企业而言&#xff0c;猎头的推荐也往往与岗位匹配度不高。那么被人们认为高深莫…

云计算、大数据和人工智能的关系

云计算、大数据和人工智能的关系 来源&#xff1a; 刘超&#xff08;popsuper1982&#xff09; https://www.cnblogs.com/popsuper1982/p/8505203.html 我今天要讲这三个话题&#xff0c;一个是云计算&#xff0c;一个大数据&#xff0c;一个人工智能&#xff0c;我为什么要讲…

大数据,云计算,人工智能之间的关系

一、云计算最初是实现资源管理的灵活性 我们首先来说云计算&#xff0c;云计算最初的目标是对资源的管理&#xff0c;管理的主要是计算资源&#xff0c;网络资源&#xff0c;存储资源三个方面。 1.1 管数据中心就像配电脑 什么叫计算&#xff0c;网络&#xff0c;存储资源呢&am…