Android RecyclerView上拉加载和下拉刷新(基础版)
发布时间 - 2026-01-10 22:57:10 点击率:次这里讲述的是用谷歌原生的SwipeRefreshLayout,进行刷新,以及利用RecycleView的滚动事件,判断是否到最后一个item,进行加载更多,这里加载更多是在RecycleView的适配器中使用不同item进行完成的。

这是activity的xml布局:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <android.support.v4.widget.SwipeRefreshLayout android:id="@+id/swipe_refresh_layout" android:layout_width="match_parent" android:layout_height="match_parent" > <android.support.v7.widget.RecyclerView android:id="@+id/recyclerview" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#F0F0F0" android:clipToPadding="false" android:paddingBottom="16dp" android:paddingTop="16dp"/> </android.support.v4.widget.SwipeRefreshLayout> <com.rey.material.widget.ProgressView android:id="@+id/progress_loading_main" app:pv_autostart="true" app:pv_circular="true" app:pv_progressStyle="@style/Material.Drawable.CircularProgress" app:pv_progressMode="indeterminate" android:layout_width="50dp" android:layout_height="50dp" android:visibility="gone" android:layout_centerInParent="true"/> </RelativeLayout>
接下来是对应activity中的代码:
import android.os.Bundle;
import android.os.Handler;
import android.support.annotation.Nullable;
import android.support.design.widget.Snackbar;
import android.support.v4.app.Fragment;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.retrofit.wangfei.viewpagertablayout.util.Constance;
import com.retrofit.wangfei.viewpagertablayout.R;
import com.retrofit.wangfei.viewpagertablayout.adapter.MyRecycleViewAdapter;
import com.rey.material.widget.ProgressView;
import java.util.ArrayList;
import java.util.List;
import butterknife.Bind;
import butterknife.ButterKnife;
public class HomeFragment extends Fragment {
@Bind(R.id.recyclerview)
RecyclerView recyclerview;
@Bind(R.id.swipe_refresh_layout)
SwipeRefreshLayout swipeRefreshLayout;
@Bind(R.id.progress_loading_main)
ProgressView progress_loading_main; // 加载数据时显示的进度圆圈
private LinearLayoutManager mRecycleViewLayoutManager;
private int mPageNum = 1;
private List<String> lists = new ArrayList<>();
private MyRecycleViewAdapter mAdapter;
public static HomeFragment newInstance() {
HomeFragment fragment = new HomeFragment();
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_home, container, false);
ButterKnife.bind(this, view);
return view;
}
/**在onCreateView方法后执行*/
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
mAdapter = new MyRecycleViewAdapter(lists,getActivity());
initRecyclerView();
swipeRefreshLayout.setColorSchemeResources(Constance.colors);//设置下拉刷新控件变换的四个颜色
recyclerview.setAdapter(mAdapter);
recyclerViewOnItemClickListener();
refresh();
loadMore(mAdapter);
progress_loading_main.setVisibility(View.VISIBLE);
initData();
}
@Override
public void onDestroyView() {
super.onDestroyView();
ButterKnife.unbind(this);
}
/**进入页面的初始化数据*/
private void initData(){
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
netNewsList(true);
progress_loading_main.setVisibility(View.GONE);
}
}, 2000);
}
/**RecyclerView每个item的点击事件*/
private void recyclerViewOnItemClickListener() {
mAdapter.setOnItemClickListener(new MyRecycleViewAdapter.OnItemClickListener() {
@Override
public void onItemClick(View view, int position) {
Snackbar.make(view, "fly", Snackbar.LENGTH_SHORT).show();
}
});
}
/**
* 初始化RecyclerView
*/
private void initRecyclerView() {
// recyclerview.setItemAnimator(new DefaultItemAnimator());
// recyclerview.setHasFixedSize(true);
mRecycleViewLayoutManager = new LinearLayoutManager(getActivity());
recyclerview.setLayoutManager(mRecycleViewLayoutManager); // 设置RecycleView,显示是ListView还是gridView还是瀑布流
}
/**下拉刷新*/
private void refresh() {
swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
netNewsList(true);
swipeRefreshLayout.setRefreshing(false); // 停止刷新
}
}, 2000);
}
});
}
/**
* 设置上拉加载更多
*
* @param adapter RecyclerView适配器
*/
public void loadMore(final MyRecycleViewAdapter adapter) {
recyclerview.addOnScrollListener(new RecyclerView.OnScrollListener() {
private int lastVisibleItem;
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
lastVisibleItem = mRecycleViewLayoutManager.findLastVisibleItemPosition(); // 滑动到最后一个
}
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
// 效果在暂停时显示, 否则会导致重绘异常
if (newState == RecyclerView.SCROLL_STATE_IDLE
&& lastVisibleItem + 1 == adapter.getItemCount()) {
if (lists != null && lists.size() >= 10) { // 真实开发中要设置mNews.size()大于加载分页显示的个数
adapter.loadLayout.setVisibility(View.VISIBLE);
//加载更多
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
netNewsList(false);
}
}, 2000);
}
}
}
});
}
/**
* 从网络加载数据列表
*
* @param isRefresh 是否刷新 true 为刷新,false为不刷新
*/
private void netNewsList(boolean isRefresh) {
// viewDelegate.showLoading();
if (isRefresh) {
mPageNum = 1;
} else {
mPageNum++;
}
if (isRefresh) {
if (!lists.isEmpty()) {
lists.clear();
}
}
// TODO 这里把页数mPageNum上传到服务端
lists.clear();
lists.addAll(getData());
mAdapter.notifyDataSetChanged();
}
private List<String> list = new ArrayList<>();
private List<String> getData() {
for (int i = 0; i < 10; i++) {
list.add(i + "");
}
return list;
}
}
接下来是RecycleView适配器中的xml文件:
这是正常item的布局,至于用CardView是为了让item展示出来的效果更好看
<?xml version="1.0" encoding="utf-8"?> <android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="wrap_content"> <TextView android:id="@+id/text" android:layout_width="match_parent" android:layout_height="50dp" android:text="" android:gravity="center"/> </android.support.v7.widget.CardView>
这是现实上拉加载的布局文件,作为不同item共同展示在RecycleView上面:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/load_layout" android:visibility="gone" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" android:orientation="horizontal" android:paddingBottom="12dip" android:paddingTop="12dip"> <com.rey.material.widget.ProgressView app:pv_autostart="true" app:pv_circular="true" app:pv_progressStyle="@style/Material.Drawable.CircularProgress" app:pv_progressMode="indeterminate" android:layout_width="24dp" android:layout_height="24dp" /> <TextView android:id="@+id/more_data_msg" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="16sp" android:layout_marginLeft="10dp" android:text="正在加载..." /> </LinearLayout>
下面我们看看RecycleView适配器的写法:
import android.app.Activity;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.retrofit.wangfei.viewpagertablayout.R;
import java.util.List;
import butterknife.Bind;
import butterknife.ButterKnife;
/**
* Created by Android Studio
* Description: RecycleView的适配器
*/
public class MyRecycleViewAdapter extends RecyclerView.Adapter {
private final static int TYPE_ITEM = 0X01;
private final static int TYPE_FOOTER = 0x02;
private List<String> lists;
private Activity context;
public LinearLayout loadLayout;
private OnItemClickListener mOnItemClickListener; // 声明接口
public MyRecycleViewAdapter(List<String> lists, Activity context) {
this.lists = lists;
this.context = context;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if (TYPE_ITEM == viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.recycle_view_item, parent,false);
ItemViewHolder itemViewHolder = new ItemViewHolder(view);
return itemViewHolder;
} else {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_footer, parent,false);
loadLayout = (LinearLayout) view.findViewById(R.id.load_layout);
return new FootViewHolder(view);
}
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
if (holder instanceof ItemViewHolder) {
String text = lists.get(position);
ItemViewHolder itemHolder = (ItemViewHolder) holder;
itemHolder.text.setText(text);
}
}
@Override
public int getItemCount() {
return lists.size() + 1;
}
@Override
public int getItemViewType(int position) {
if (position + 1 == getItemCount()) {
return TYPE_FOOTER;
} else {
return TYPE_ITEM;
}
}
public class ItemViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
@Bind(R.id.text)
TextView text;
public ItemViewHolder(View itemView) {
super(itemView);
ButterKnife.bind(this,itemView);
itemView.setOnClickListener(this);
}
@Override
public void onClick(View v) {
mOnItemClickListener.onItemClick(v,getPosition());
}
}
public class FootViewHolder extends RecyclerView.ViewHolder {
public FootViewHolder(View itemView) {
super(itemView);
}
}
/**调到外部使用*/
public void setOnItemClickListener(OnItemClickListener onItemClickListener){
this.mOnItemClickListener = onItemClickListener;
}
/**定义接口*/
public interface OnItemClickListener{
void onItemClick(View v,int position);
}
}
最后是刷新控件的4个不同颜色:
public interface Constance {
/**
* 下拉刷新控件变化的四个颜色
*/
int[] colors = new int[] {
android.R.color.holo_green_light, android.R.color.holo_blue_light,
android.R.color.holo_green_light, android.R.color.holo_blue_light
};
}
所需要的依赖库:
compile 'com.android.support:appcompat-v7:23.3.0' compile 'com.android.support:design:23.3.0' compile 'com.jakewharton:butterknife:7.0.1' compile 'com.android.support:support-v4:23.3.0' /**谷歌服务*/ compile 'com.google.android.gms:play-services:8.4.0' compile 'com.github.rey5137:material:1.2.2'
到这里就结束了,完成了下拉刷新和上拉加载更多的实现。
下面说说RecyclerView的使用最基础的三点:
一:
recyclerview.setHasFixedSize(true); //方法用来使RecyclerView保持固定的大小,该信息被用于自身的优化。
二:
recyclerview.setItemAnimator(new DefaultItemAnimator());
ItemAnimator会根据适配器上收到的通知动画显示视图组的修改。基本上,它会自动显示添加和移除条目动画。这也不是一个简单的类,但我们发现DefaultItemAnimator已经可以运行得很好了。
三:
recyclerview.setLayoutManager(mRecycleViewLayoutManager); // 设置RecycleView,显示是ListView还是gridView还是瀑布流。 // 显示是ListView LinearLayoutManager mRecycleViewLayoutManager = new LinearLayoutManager(context); // 显示是gridView,参数一:上下文,参数二:列数 GridLayoutManager mGridLayoutManager=new GridLayoutManager(context, 4); // 显示是瀑布流,参数一:显示几列,参数二:现实的方向,垂直或水平 StaggeredGridLayoutManager mStaggeredGridLayoutManager=new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL);
更多详细请参考:Android 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 Docker环境搭建教程_Laravel Sail使用指南
千库网官网入口推荐 千库网设计创意平台入口
javascript事件捕获机制【深入分析IE和DOM中的事件模型】
Swift中switch语句区间和元组模式匹配
Laravel如何使用集合(Collections)进行数据处理_Laravel Collection常用方法与技巧
Python高阶函数应用_函数作为参数说明【指导】
Laravel怎么多语言本地化设置_Laravel语言包翻译与Locale动态切换【手册】
Laravel如何监控和管理失败的队列任务_Laravel失败任务处理与监控
Laravel与Inertia.js怎么结合_使用Laravel和Inertia构建现代单页应用
mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?
Laravel distinct去重查询_Laravel Eloquent去重方法
网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?
零基础网站服务器架设实战:轻量应用与域名解析配置指南
EditPlus中的正则表达式实战(5)
如何制作一个表白网站视频,关于勇敢表白的小标题?
网站优化排名时,需要考虑哪些问题呢?
如何在搬瓦工VPS快速搭建网站?
百度输入法ai面板怎么关 百度输入法ai面板隐藏技巧
nodejs redis 发布订阅机制封装实现方法及实例代码
Win11怎么开启自动HDR画质_Windows11显示设置HDR选项
标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?
如何实现javascript表单验证_正则表达式有哪些实用技巧
html5的keygen标签为什么废弃_替代方案说明【解答】
Laravel如何安装Breeze扩展包_Laravel用户注册登录功能快速实现【流程】
Laravel Eloquent:优雅地将关联模型字段扁平化到主模型中
深入理解Android中的xmlns:tools属性
实例解析Array和String方法
C++时间戳转换成日期时间的步骤和示例代码
微信小程序 HTTPS报错整理常见问题及解决方案
JavaScript模板引擎Template.js使用详解
装修招标网站设计制作流程,装修招标流程?
Laravel如何将应用部署到生产服务器_Laravel生产环境部署流程
成都网站制作公司哪家好,四川省职工服务网是做什么用?
Laravel如何使用Vite进行前端资源打包?(配置示例)
独立制作一个网站多少钱,建立网站需要花多少钱?
SQL查询语句优化的实用方法总结
济南网站建设制作公司,室内设计网站一般都有哪些功能?
Laravel如何从数据库删除数据_Laravel destroy和delete方法区别
javascript中闭包概念与用法深入理解
Laravel Sail是什么_基于Docker的Laravel本地开发环境Sail入门
文字头像制作网站推荐软件,醒图能自动配文字吗?
laravel怎么配置Redis作为缓存驱动_laravel Redis缓存配置教程
家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?
简单实现Android文件上传
如何快速搭建高效服务器建站系统?
Gemini手机端怎么发图片_Gemini手机端发图方法【步骤】
Bootstrap整体框架之JavaScript插件架构
Laravel怎么实现搜索功能_Laravel使用Eloquent实现模糊查询与多条件搜索【实例】
Laravel项目如何进行性能优化_Laravel应用性能分析与优化技巧大全
JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)
上一篇:聊聊thinkphp中if的用法
上一篇:聊聊thinkphp中if的用法

