目录:
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()