Android之RecyclerView轻松实现下拉刷新和加载更多示例
发布时间 - 2026-01-10 23:07:36 点击率:次今天研究了下RecyclerView的滑动事件,特别是下拉刷新和加载更多事件,在现在几乎所有的APP显示数据列表时都用到了。自定义RecyclerView下拉刷新和加载更多听上去很复杂,实际上并不难,只要是对滑动事件的监听和处理。

一、自定义RecyclerView实现下拉刷新和加载更多
1、如何判断RecyclerView是在上滑还是下滑
在RecyclerView的OnScrollListener滑动事件监听中有个好用的方法,就是onScrolled(RecyclerView recyclerView, int dx, int dy),其中根据dx的值的正负就可以判断是在左滑还是右滑,而根据dy的值就可以判断是在上滑还是下滑。
//上滑
if(dy>0){
//相应操作代码
}
//下滑
else if(dy<0){
//相应操作代码
}
2、如何判断是否滑到了顶部或者底部
同样在RecyclerView的OnScrollListener滑动事件监听中onScrolled(RecyclerView recyclerView, int dx, int dy)方法中处理,根据canScrollVertically(int direction)来进行判断。
//是否滑到底部
if(!recyclerView.canScrollVertically(1)){
//相应处理操作
}
//是否滑到顶部
if(!recyclerView.canScrollVertically(-1)){
//相应处理操作
}
3、自定义RecyclerView
知道了滑动事件的判断和处理,就可以很轻松得实现下拉刷新和加载更多了。
import android.content.Context;
import android.support.annotation.Nullable;
import android.support.v7.widget.RecyclerView;
import android.util.AttributeSet;
import android.util.Log;
/**
* Package:com.liuting.library
* author:liuting
* Date:2017/2/14
* Desc:自定义RecycleView,下拉刷新以及上拉加载更多
*/
public class RefreshLoadMoreRecycleView extends RecyclerView {
private Boolean isLoadMore;//是否可以加载更多标志
private Boolean isLoadEnd;//加载到最后的标志
private Boolean isLoadStart;//顶部的标志
private Boolean isRefresh;//是否可以下拉刷新标志
private int lastVisibleItem;//最后一项
private IOnScrollListener listener;//事件监听
public RefreshLoadMoreRecycleView(Context context) {
super(context);
init(context);
}
public RefreshLoadMoreRecycleView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
init(context);
}
public RefreshLoadMoreRecycleView(Context context, @Nullable AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init(context);
}
public void init(Context context) {
isLoadEnd=false;
isLoadStart =true;
this.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
//SCROLL_STATE_DRAGGING 和 SCROLL_STATE_IDLE 两种效果自己看着来
if (newState == RecyclerView.SCROLL_STATE_IDLE) {
if (isLoadEnd) {
// 判断是否已加载所有数据
if (isLoadMore) {//未加载完所有数据,加载数据,并且还原isLoadEnd值为false,重新定位列表底部
if (getListener() != null) {
getListener().onLoadMore();
}
} else {//加载完了所有的数据
if(getListener()!=null){
getListener().onLoaded();
}
}
isLoadEnd = false;
} else if (isLoadStart) {
if(isRefresh){
if (getListener() != null) {
getListener().onRefresh();
}
isLoadStart=false;
}
}
}
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
//上滑
if(dy>0){
//是否滑到底部
if(!recyclerView.canScrollVertically(1)){
isLoadEnd = true;
}else{
isLoadEnd = false;
}
}
//下滑
else if(dy<0){
//是否滑到顶部
if(!recyclerView.canScrollVertically(-1)){
isLoadStart=true;
}else{
isLoadStart=false;
}
}
}
});
}
//监听事件
public interface IOnScrollListener {
void onRefresh();
void onLoadMore();
void onLoaded();
}
public IOnScrollListener getListener() {
return listener;
}
public void setListener(IOnScrollListener listener) {
this.listener = listener;
}
public Boolean getLoadMore() {
return isLoadMore;
}
//设置是否支持加载更多
public void setLoadMoreEnable(Boolean loadMore) {
isLoadMore = loadMore;
}
public Boolean getRefresh() {
return isRefresh;
}
//设置是否支持下拉刷新
public void setRefreshEnable(Boolean refresh) {
isRefresh = refresh;
}
}
二、实际用例
已经定义好了RecyclerView,下面在Demo中实际使用和处理。
1、定义布局
布局文件很简单,就是一个RecyclerView
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="com.liuting.refreshloadmorelistview.MainActivity"> <com.liuting.library.RefreshLoadMoreRecycleView android:id="@+id/main_recycle_view_data" android:layout_width="match_parent" android:layout_height="match_parent" android:scrollbars="none" /> </LinearLayout>
2、定义RecyclerView.Adapter
RecyclerView.Adapter在这里就简单处理了,列表布局直接使用Android自带的。
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import java.util.List;
/**
* Package:com.liuting.refreshloadmorelistview.adapter
* author:liuting
* Date:2017/2/16
* Desc:列表Adapter
*/
public class RefreshLoadMoreRecycleAdapter extends RecyclerView.Adapter<RefreshLoadMoreRecycleAdapter.ViewHolder> {
private List<String> list;
private Context context;
public RefreshLoadMoreRecycleAdapter(Context context,List<String> list) {
this.context =context;
this.list = list;
}
@Override
public RefreshLoadMoreRecycleAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(android.R.layout.simple_expandable_list_item_1, parent, false);
RefreshLoadMoreRecycleAdapter.ViewHolder viewHolder = new RefreshLoadMoreRecycleAdapter.ViewHolder(view);
return viewHolder;
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
holder.text.setText(list.get(position));
holder.itemView.setTag(position);
}
@Override
public int getItemCount() {
return list.size();
}
class ViewHolder extends RecyclerView.ViewHolder{
private TextView text;
public ViewHolder(View itemView) {
super(itemView);
text=(TextView)itemView.findViewById(android.R.id.text1);
}
}
}
3、在Activity中定义好控件以及数据加载操作
实现自定义RecyclerView中的数据加载事件监听,刷新、加载更多以及加载完成。
import android.app.ProgressDialog;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.widget.Toast;
import com.liuting.library.RefreshLoadMoreRecycleView;
import com.liuting.refreshloadmorelistview.adapter.RefreshLoadMoreRecycleAdapter;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity implements RefreshLoadMoreRecycleView.IOnScrollListener{
private RefreshLoadMoreRecycleView recycleView;//下拉刷新RecycleView
private List<String> list;//列表
private RefreshLoadMoreRecycleAdapter adapter;//Adapter
private ProgressDialog dialog;//提示框
private static final int REFRESH_Load=0;//下拉刷新
private static final int MORE_Load=1;//加载更多
private Handler handler =new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what){
case REFRESH_Load:
recycleView.setLoadMoreEnable(true);
dismissDialog();
if(list!=null){
list.clear();
}
loadData();
adapter.notifyDataSetChanged();
break;
case MORE_Load:
recycleView.setLoadMoreEnable(false);
dismissDialog();
loadData();
adapter.notifyDataSetChanged();
break;
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
public void initView(){
dialog = new ProgressDialog(MainActivity.this);
list=new ArrayList<>();
loadData();
recycleView = (RefreshLoadMoreRecycleView)findViewById(R.id.main_recycle_view_data);
final LinearLayoutManager linearLayoutManager = new LinearLayoutManager(MainActivity.this);
recycleView.setLayoutManager(linearLayoutManager);
adapter = new RefreshLoadMoreRecycleAdapter(MainActivity.this,list);
recycleView.setAdapter(adapter);
recycleView.setListener(this);
recycleView.setRefreshEnable(true);
recycleView.setLoadMoreEnable(true);
}
/**
* 加载数据
*/
public void loadData(){
for(int i=0;i<10;i++ ){
list.add("It is "+i);
}
}
@Override
public void onRefresh() {
showDialog();
new Thread(){
@Override
public void run() {
super.run();
try {
sleep(5000);
handler.sendEmptyMessage(REFRESH_Load);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}.start();
}
@Override
public void onLoadMore() {
showDialog();
new Thread(){
@Override
public void run() {
super.run();
try {
sleep(5000);
handler.sendEmptyMessage(MORE_Load);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}.start();
}
@Override
public void onLoaded() {
Toast.makeText(MainActivity.this,"Loaded all",Toast.LENGTH_SHORT).show();
}
/**
* dismiss dialog
*/
private void dismissDialog(){
if (dialog!=null&&dialog.isShowing()){
dialog.dismiss();
}
}
/**
* show dialog
*/
private void showDialog(){
if (dialog!=null&&!dialog.isShowing()){
dialog.show();
}
}
}
三、最终效果图
到这里就轻松实现了RecyclerView的下拉刷新和加载更多了。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# recyclerview下拉刷新
# recyclerview加载更多
# recyclerview
# 刷新
# android RecyclerView侧滑菜单
# 滑动删除
# 长按拖拽
# 下拉刷新上拉加载
# Android RecyclerView实现下拉刷新和上拉加载更多
# Android RecyclerView上拉加载和下拉刷新(基础版)
# Android RecyclerView上拉加载和下拉刷新
# RecyclerView下拉刷新上拉加载
# Android RecyclerView下拉刷新和上拉加载更多
# Android使用recyclerview打造真正的下拉刷新上拉加载效果
# Android RecyclerView 上拉加载更多及下拉刷新功能的实现方法
# Android RecyclerView实现下拉刷新和上拉加载
# XRecyclerView实现下拉刷新、滚动到底部加载更多等功能
# 加载
# 自定义
# 滑到
# 就可以
# 在上
# 如何判断
# 看着
# 是在
# 在这里
# 好了
# 有个
# 两种
# 很简单
# 自带
# 好用
# 都用
# 几乎所有
# 值为
# 大家多多
# 很复杂
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel怎么使用Blade模板引擎_Laravel模板继承与Component组件复用【手册】
bootstrap日历插件datetimepicker使用方法
开心动漫网站制作软件下载,十分开心动画为何停播?
七夕网站制作视频,七夕大促活动怎么报名?
活动邀请函制作网站有哪些,活动邀请函文案?
如何用PHP工具快速搭建高效网站?
Laravel事件和监听器如何实现_Laravel Events & Listeners解耦应用的实战教程
Laravel怎么使用artisan命令缓存配置和视图
Laravel如何使用Eloquent ORM进行数据库操作?(CRUD示例)
阿里云高弹*务器配置方案|支持分布式架构与多节点部署
个人网站制作流程图片大全,个人网站如何注销?
软银砸40亿美元收购DigitalBridge 强化AI资料中心布局
北京网站制作的公司有哪些,北京白云观官方网站?
Android滚轮选择时间控件使用详解
JS弹性运动实现方法分析
Laravel如何使用Facades(门面)及其工作原理_Laravel门面模式与底层机制
Win11怎么关闭资讯和兴趣_Windows11任务栏设置隐藏小组件
如何在建站宝盒中设置产品搜索功能?
Laravel如何使用Service Container和依赖注入?(代码示例)
Laravel的Blade指令怎么自定义_创建你自己的Laravel Blade Directives
Mybatis 中的insertOrUpdate操作
浅谈Javascript中的Label语句
如何确保西部建站助手FTP传输的安全性?
香港服务器网站生成指南:免费资源整合与高速稳定配置方案
Laravel怎么生成二维码图片_Laravel集成Simple-QrCode扩展包与参数设置【实战】
javascript基本数据类型及类型检测常用方法小结
Python高阶函数应用_函数作为参数说明【指导】
专业商城网站制作公司有哪些,pi商城官网是哪个?
如何打造高效商业网站?建站目的决定转化率
Windows10如何删除恢复分区_Win10 Diskpart命令强制删除分区
南京网站制作费用,南京远驱官方网站?
如何快速生成专业多端适配建站电话?
如何在搬瓦工VPS快速搭建网站?
HTML5打空格有哪些误区_新手常犯的空格使用错误【技巧】
php结合redis实现高并发下的抢购、秒杀功能的实例
Zeus浏览器网页版官网入口 宙斯浏览器官网在线通道
使用Dockerfile构建java web环境
C语言设计一个闪闪的圣诞树
JavaScript如何实现音频处理_Web Audio API如何工作?
java中使用zxing批量生成二维码立牌
百度输入法ai组件怎么删除 百度输入法ai组件移除工具
使用PHP下载CSS文件中的所有图片【几行代码即可实现】
Laravel怎么上传文件_Laravel图片上传及存储配置
php8.4header发送头信息失败怎么办_php8.4header函数问题解决【解答】
佐糖AI抠图怎样调整抠图精度_佐糖AI精度调整与放大细化操作【攻略】
Laravel如何发送邮件和通知_Laravel邮件与通知系统发送步骤
如何在七牛云存储上搭建网站并设置自定义域名?
Laravel Eloquent模型如何创建_Laravel ORM基础之Model创建与使用教程
如何做网站制作流程,*游戏网站怎么搭建?
Laravel如何使用Scope本地作用域_Laravel模型常用查询逻辑封装技巧【手册】

