Recyclerview上拉加载下拉刷新

本文详细介绍了如何实现RecyclerView的上拉加载和下拉刷新功能,包括需求概述、解决方案分析及具体案例实现,涵盖了数据实体类、数据处理、布局设计、适配器和主活动类的代码细节。
摘要由CSDN通过智能技术生成
目录:
     1.需求与概述
     2.解决方案分析     
     3.案例实现

1.需求与概述
         上拉加载下拉刷新可以说是APP最普遍的一个需求了,当应用需要在页面加载 庞大的数据但又不能 一次 全部加载完的时候,边看边加载就必不可少了,而实现上拉加载可以通过我们的ListView去实现或者是通过我们今天的猪脚,RecyclerView。RecyclerView啥都好唯一不好的一点就是需要我们自己去写数据集的头部和底部。接下来我们就来分析一下实现这个需求我们需要的主要控件和作用是啥。

2.解决方案分析
    我们的解决方案是SwipeRefreshLayout+RecyclerView,而SwipeRefreshLayout实现的是下拉刷新功能,当下拉触发的时候通过开启线程去加载新的数据;而上拉加载需要我们自己去实现,说到这儿,那我们应该怎么去实现呢?我们都知道RecyclerView的adapter中有个叫viewType的东西,如果还不了解viewType是干嘛的,可以看看我前两篇文章( ReyclerView花样布局 )和( RecyclerView彩虹瀑布流实现 )   根据不同的viewType可以对应去加载不同的布局。这里上拉加载就是在每次滑动到最后一个item的时候去加载一个footerview,当每一个footerview加载出来的时候就去启动一个线程加载更多的数据显示,以此循环,当加载完数据之后又根据不同的viewType加载一个无数据的提示布局,并且不做加载更多的动作,大概就是这样。

3.案例实现
    说总是那么不明不白,我们应该动手写,接下来就是小案例的代码,不过得先来个效果图。
    (1)效果截图(图片来自堆糖,就喜欢这种调调)
   


 要实现分页加载当然得先来点数据,接下来是数据的创建于分页。

        (2) 数据实体类RefreshObject.java
   
   
   
package com.example.recyclerviewdemo;
 
import java.io.Serializable;
 
/**
* Created by elimy on 2017-01-20.
*/
public class RefreshObject implements Serializable {
private int Image;
private String desc;
 
public String getDesc() {
return desc;
}
 
public void setDesc(String desc) {
this.desc = desc;
}
 
public int getImage() {
return Image;
}
 
public void setImage(int image) {
Image = image;
}
 
public RefreshObject(int image, String desc) {
this.Image = image;
this.desc = desc;
}
 
 
 
}
    
    (3)数据集合处理类GetDataPage.java
   
   
   
package com.example.recyclerviewdemo;
 
import java.lang.reflect.Field;
import java.util.ArrayList;
 
/**
* 该类实现通过传入指定的单页数据大小和页面编号返回指定的数据集
* 简单模拟了后端分页数据的加载
* Created by elimy on 2017-01-20.
*/
public class GetDataByPage {
 
final int DEFAULT_SIZE = 5;
 
/*
* 根据传入的页数,以及默认的大小,获取返回对应的数据
* */
public ArrayList<RefreshObject> getPageData(int pageNum) {
 
int size = DEFAULT_SIZE;
ArrayList<RefreshObject> pageList = new ArrayList<>();
 
//第一条数据的位置
int start_item = (pageNum - 1) * 5;
//最后一条数据的位置
int end_item = start_item + size - 1;
 
//获取到全部数据的ArrayList
ArrayList allList = createAllData();
 
//这里要注意最后一页的数据是否小于了页面默认的大小
if (pageNum <= allList.size() / size) {
for (int i = start_item; i <= end_item; i++) {
pageList.add((RefreshObject) allList.get(i));
}
} else if ((allList.size() % size) != 0) {
for (int i = start_item; i < allList.size(); i++) {
pageList.add((RefreshObject) allList.get(i));
}
}
return pageList;
}
 
public int getMaxPage(int size) {
 
int maxPage;
 
ArrayList<RefreshObject> allList = createAllData();
 
maxPage = (int) Math.ceil((double) allList.size() / size);
 
return maxPage;
}
 
/*
* 这里重载了上面一个方法,作用雷同,只是这个方法用户可以自定义页面的大小
* */
public ArrayList<RefreshObject> getPageData(int size, int pageNum) {
 
ArrayList<RefreshObject> pageList = new ArrayList<>();
int start_item = (pageNum - 1) * size;
int end_item = start_item + size - 1;
 
ArrayList<RefreshObject> allList = createAllData();
if (pageNum <= allList.size()
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个Android RecyclerView实现上拉刷新下拉加载和工具栏的示例代码: 在build.gradle文件中添加以下依赖项: ``` implementation 'com.android.support:recyclerview-v7:28.0.0' implementation 'com.android.support:appcompat-v7:28.0.0' ``` 添加以下布局文件: ``` <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/recycler_view" android:layout_width="match_parent" android:layout_height="match_parent"/> </android.support.v4.widget.SwipeRefreshLayout> <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="@color/colorPrimary" android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/> ``` 在Activity或Fragment中添加以下代码: ``` private SwipeRefreshLayout swipeRefreshLayout; private RecyclerView recyclerView; private Toolbar toolbar; private LinearLayoutManager layoutManager; private MyAdapter adapter; // 在onCreate中添加以下代码 swipeRefreshLayout = findViewById(R.id.swipe_refresh_layout); recyclerView = findViewById(R.id.recycler_view); toolbar = findViewById(R.id.toolbar); setSupportActionBar(toolbar); layoutManager = new LinearLayoutManager(this); recyclerView.setLayoutManager(layoutManager); adapter = new MyAdapter(dataList); recyclerView.setAdapter(adapter); swipeRefreshLayout.setColorSchemeColors(getResources().getColor(R.color.colorPrimary), getResources().getColor(R.color.colorAccent), getResources().getColor(R.color.colorPrimaryDark)); swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { @Override public void onRefresh() { // 下拉刷新操作 // 可以在这里进行网络请求等操作 // 请求完成后,在主线程调用setRefreshing(false)方法结束刷新动画 swipeRefreshLayout.setRefreshing(false); } }); recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); if (newState == RecyclerView.SCROLL_STATE_IDLE && !recyclerView.canScrollVertically(1)) { // 上拉加载操作 // 可以在这里进行网络请求等操作 adapter.notifyDataSetChanged(); } } }); ``` 其中,MyAdapter是RecyclerView的适配器,dataList是数据列表。在适配器中,可以定义ViewHolder和绑定数据等方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值