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 组件来实现 上拉和下拉加载更 ...
随机推荐
- 【.NET MF】.NET Micro Framework USB移植
1.开发环境 windows 7 32位 MDK 4.54 .Net Micro Framework Porting Kit 4.2(RTM QFE2) .Net Micro Framework ...
- Tomcat数据源(DataSource)简介
JDBC2.0提供了javax.sql.DataSource接口,它负责建立与数据库的连接,在应用程序中访问数据库时不必编写连接数据库的代码,可以直接从数据源获得数据库连接 1.数据库和连接池 在Da ...
- php静态缓存简单制作
制作缓存的目的是为了让我们的页面运行更加快速,减少读取数据库内容的次数,给用户更好的体验,为此我们可以使自己的程序做一下缓存,并且设置一个缓存过期的时间,来保证与数据库的一致,当然并不是所有的程序都适 ...
- JavaScript 9种类型
Undefined . Null . Boolean . String . Number . Object . Reference .List .Completion
- 设计模式之单例模式的简单demo
/* * 设计模式之单例模式的简单demo */ class Single { /* * 创建一个本类对象. * 和get/set方法思想一样,类不能直接调用对象 * 所以用private限制权限 * ...
- 5.6 JS中基本包装类型
为了便于操作基本类型值,ES还提供了三种特殊的引用类型,即(基本包装类型):Number,String,Boolean.这三种类型与前面介绍的引用类型相似,但同时也拥有基本数据类型的一些特性. 平时经 ...
- jQuery技巧大放送
1.关于页面元素的引用 通过jquery的$()引用元素包括通过id.class.元素名以及元素的层级关系及dom或者xpath条件等方法,且返回的对象为jquery对象(集合对象),不能直接调用do ...
- 十种MYSQL显错注入原理讲解(一)
开篇我要说下,在<代码审计:企业级Web代码安全架构>这本书中讲十种MYSQL显错注入,讲的很清楚. 感兴趣请去读完,若处于某种原因没读还想了解,那请继续往下. 1.count,rand, ...
- Xcode自定义代码块
到现在才发现原来Xcode有自定义代码块这么神奇的功能,能简化很多无聊的敲重复代码的工作,真是感叹我怎么才知道!!! 具体的设置流程见:http://nshipster.cn/xcode-snippe ...
- RecyclerView如何消除底部的分割线
最近遇到一个问题,用RecyclerView显示数据,纵向列表显示,添加默认分割线. 问题是:底部也会显示分割线,这很影响美观. 怎么解决这个问题呢?我想了很多办法,毫无头绪... 最后, ...