Android ListView上拉获取下一页
关于ListView上拉刷新的需求很多,实现方式也多种多样。
一般是简单的通过一个page变量来控制当前请求的页数,然后上拉的时候就发送请求。
实现出来后,经过测试哥的折腾,发现有诸多细节没有处理好,比如会出现重复数据,反复的上拉导致多次请求等bug。
后来就决定单独写一个工具类,方便以后需要直接使用。
public class ListViewScrollHelper<T> {
private static final String TAG = "ListViewScrollHelper";
private static final int LIST_PAGE_SIZE = 15;
private NextPage nextPage;
private InitAdapter initAdapter;
private int pageIndex = -1;
private int totalPage;
private ListView lv_goodsList;
private BaseAdapter goodsAdapter;
private List<T> goodsList = new ArrayList<>();
private Semaphore semaphore = new Semaphore(0);
public ListViewScrollHelper(ListView lv_goodsList, InitAdapter initAdapter, NextPage nextPage) {
this.initAdapter = initAdapter;
this.lv_goodsList = lv_goodsList;
this.nextPage = nextPage;
initView();
}
private void initView() {
goodsAdapter = initAdapter.initAdapter(goodsList);
lv_goodsList.setAdapter(goodsAdapter);
lv_goodsList.setOnScrollListener(new AbsListView.OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
// 判断是否到底部了
if (firstVisibleItem + visibleItemCount == totalItemCount && totalItemCount > 0) {
Log.d(TAG, String.valueOf(pageIndex));
if (hasNextPage() && canRequestNextPage()) {
pageIndex++;
if (nextPage != null)
nextPage.next();
} else {
Log.d(TAG, "列表已经到底部!");
}
}
}
});
}
/**
* 此函数将会作为分页刷新数据的主函数
* 内部将会实现 根据当前页数判断是否重置数据 或者 继续下一页
* 如果重置数据,初始化起始页需要使用函数 resetPageIndex()
*
* @param list
* @param totalSize
*/
public void refreshPage(List list, int totalSize) {
if (pageIndex < 0) {
initData(list, totalSize);
} else {
freshList(list);
}
}
/**
* 如果有多处控制一个listview数据内容(比如:分类,搜索都能控制商品列表展示)
* ,此时可以使用此函数设置分页信息
*
* @param list
* @param totalSize
*/
public void initData(List list, int totalSize) {
pageIndex = 0;
goodsList.clear();
if (totalSize > LIST_PAGE_SIZE) {
totalPage = totalSize / LIST_PAGE_SIZE;
if (totalSize % LIST_PAGE_SIZE >= 1)
totalPage++;
Log.d("wbl", "totalPage:" + totalPage);
} else {
totalPage = 1;
}
freshList(list);
}
/**
* 设置下一面的数据
*
* @param list
* @param type (此字段废弃)
*/
public void nextPage(List list, int type) {
freshList(list);
}
/**
* 当请求失败时,恢复上到一页
*/
public void restoreLastPage() {
if (!canRequestNextPage()) {
if (pageIndex > 0) pageIndex--;
}
semaphore.release();
}
private boolean hasNextPage() {
return pageIndex < totalPage - 1;
}
public int getPageIndex() {
return pageIndex < 0 ? 0 : pageIndex;
}
public int getPageIndex(boolean hasCategoryChange) {
if (hasCategoryChange)
pageIndex = 0;
return getPageIndex();
}
/**
* 重置分页参数
*/
public void resetPageIndex() {
pageIndex = -1;
totalPage = 0;
}
public void setEmptyView(View view) {
lv_goodsList.setEmptyView(view);
}
/**
* @param list 传入要显示的list
*/
private void freshList(List list) {
if (list != null && list.size() > 0) {
goodsList.addAll(list);
}
goodsAdapter.notifyDataSetChanged();
semaphore.release();
}
private boolean canRequestNextPage() {
return semaphore.tryAcquire();
}
public List<T> getGoodsList() {
return goodsList;
}
public interface NextPage {
void next();
}
public interface InitAdapter<T> {
BaseAdapter initAdapter(List<T> list);
}
}
详细使用可以参考这个项目
https://github.com/awenblue/ListViewScroll
Android ListView上拉获取下一页的更多相关文章
- android ListView上拉加载更多 下拉刷新功能实现(采用pull-to-refresh)
Android实现上拉加载更多功能以及下拉刷新功能, 采用了目前比较火的PullToRefresh,他是目前实现比较好的下拉刷新的类库. 目前他支持的控件有:ListView, ExpandableL ...
- listView上拉刷新下拉加载
xlistview_header.xml <?xml version="1.0" encoding="utf-8"?> <RelativeLa ...
- Flutter学习笔记(25)--ListView实现上拉刷新下拉加载
如需转载,请注明出处:Flutter学习笔记(25)--ListView实现上拉刷新下拉加载 前面我们有写过ListView的使用:Flutter学习笔记(12)--列表组件,当列表的数据非常多时,需 ...
- Android PullToRefreshListView上拉刷新和下拉刷新
PullToRefreshListView实现上拉和下拉刷新有两个步骤: 1.设置刷新方式 pullToRefreshView.setMode(PullToRefreshBase.Mode.BOTH) ...
- Android之 RecyclerView,CardView 详解和相对应的上拉刷新下拉加载
随着 Google 推出了全新的设计语言 Material Design,还迎来了新的 Android 支持库 v7,其中就包含了 Material Design 设计语言中关于 Card 卡片概念的 ...
- Android仿淘宝继续上拉进入商品详情页的效果,使用双Fragment动画切换;
仿淘宝继续上拉进入商品详情页的效果,双Fragment实现: 动画效果: slide_above_in.xml <?xml version="1.0" encoding=&q ...
- ListView 上拉加载更多
ListView 上拉加载更多 首先来个效果图 界面布局 <?xml version="1.0" encoding="utf-8"?> <Re ...
- 使用iScroll实现上拉或者下拉刷新
上拉或者下拉刷新的需求在移动端是非常常见的需求,大部分情况下,实现这个效果都使用网上现有的解决方案,例如有人使用swiper这个插件, 也有人使用iScroll这个滚动插件.本文的示例是利用iscro ...
- 微信小程序实现上拉和下拉加载更多
在上一篇文章中,我们知道了使用 scroll-view 可以实现上拉加载更多,但是由于 scroll-view 的限制,它无法实现下拉加载更多,这篇文章我们使用 view 组件来实现 上拉和下拉加载更 ...
随机推荐
- 使用 SSH上传安装tomcat
开发步骤: 1.在soft文件夹下上传tomcat 2.[root@localhost soft]# tar -zxvf apache-tomcat-7.0.61.tar.gz //解压安装 ...
- python之最强王者(10)———文件(File)、输入输出的基本操作
1. Python 文件I/O 本章只讲述所有基本的的I/O函数,更多函数请参考Python标准文档. 2.打印到屏幕 最简单的输出方法是用print语句,你可以给它传递零个或多个用逗号隔开的表达式. ...
- Android的历史与花边
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 历史 现在的Android如日中天.每天150万部的Android设备被激活,全球 ...
- HttpClient调用webApi时注意的小问题
HttpClient client = new HttpClient(); client.BaseAddress = new Uri(thisUrl); client.GetAsync("a ...
- pagebean pagetag java 后台代码实现分页 demo 前台标签分页 后台java分页
java 后台代码实现分页 demo 实力 自己写的 标签分页 package com.cszoc.sockstore.util; import java.util.HashMap;import ja ...
- Android 从零开始打造异步处理框架
转载请标明出处:http://www.cnblogs.com/zhaoyanjun/p/5995752.html 本文出自[赵彦军的博客] 概述 在Android中会使用异步任务来处理耗时操作,避免出 ...
- Razor速记
1.语法 @{ int c=2; } @for(int i=0;i<c;i++) { @i @:@i @:select @:select @i s ...
- GUID生成器
这个GUID生成器是一个小巧的软件,属于笔者在空余时间开发的. http://pan.baidu.com/s/1sk6VGpn
- es6
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- (二)Spark-Linux环境准备-Java&Python版Spark
Spark-Linux环境准备 视频教程: 1.优酷 2.YouTube 硬软件环境 1.虚拟机:VMware Workstation 12 2.虚拟机操作系统:RedHat5u4,单核,1G内存,2 ...