关于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上拉获取下一页的更多相关文章

  1. android ListView上拉加载更多 下拉刷新功能实现(采用pull-to-refresh)

    Android实现上拉加载更多功能以及下拉刷新功能, 采用了目前比较火的PullToRefresh,他是目前实现比较好的下拉刷新的类库. 目前他支持的控件有:ListView, ExpandableL ...

  2. listView上拉刷新下拉加载

    xlistview_header.xml <?xml version="1.0" encoding="utf-8"?> <RelativeLa ...

  3. Flutter学习笔记(25)--ListView实现上拉刷新下拉加载

    如需转载,请注明出处:Flutter学习笔记(25)--ListView实现上拉刷新下拉加载 前面我们有写过ListView的使用:Flutter学习笔记(12)--列表组件,当列表的数据非常多时,需 ...

  4. Android PullToRefreshListView上拉刷新和下拉刷新

    PullToRefreshListView实现上拉和下拉刷新有两个步骤: 1.设置刷新方式 pullToRefreshView.setMode(PullToRefreshBase.Mode.BOTH) ...

  5. Android之 RecyclerView,CardView 详解和相对应的上拉刷新下拉加载

    随着 Google 推出了全新的设计语言 Material Design,还迎来了新的 Android 支持库 v7,其中就包含了 Material Design 设计语言中关于 Card 卡片概念的 ...

  6. Android仿淘宝继续上拉进入商品详情页的效果,使用双Fragment动画切换;

    仿淘宝继续上拉进入商品详情页的效果,双Fragment实现: 动画效果: slide_above_in.xml <?xml version="1.0" encoding=&q ...

  7. ListView 上拉加载更多

    ListView 上拉加载更多 首先来个效果图 界面布局 <?xml version="1.0" encoding="utf-8"?> <Re ...

  8. 使用iScroll实现上拉或者下拉刷新

    上拉或者下拉刷新的需求在移动端是非常常见的需求,大部分情况下,实现这个效果都使用网上现有的解决方案,例如有人使用swiper这个插件, 也有人使用iScroll这个滚动插件.本文的示例是利用iscro ...

  9. 微信小程序实现上拉和下拉加载更多

    在上一篇文章中,我们知道了使用 scroll-view 可以实现上拉加载更多,但是由于 scroll-view 的限制,它无法实现下拉加载更多,这篇文章我们使用 view 组件来实现 上拉和下拉加载更 ...

随机推荐

  1. Linux安装jdk

    查看Java的版本命令:java -version 查看java版本的方法是:运行--->cmd,输入java –version.注意: java命令后是有个空格的,-version表示参数而已 ...

  2. SQL Server导入数据时“启用标示插入”详解

    在SQL Server中导入数据时,会有一个"启用标示插入"的选项,突然间懵逼了,这到底啥意思?我选与不选这个选项,结果好像没区别!不科学啊这,"存在即合理", ...

  3. 移动Web触摸与运动解决方案AlloyTouch开源啦

    传送门 Github地址:https://github.com/AlloyTeam/AlloyTouch 简介 AlloyTouch的本质是运动一个数字,把数字的物理变化映射到你想映射的任何属性上.所 ...

  4. Oracle研究专题:Oracle系统安装与配置

    最近开始研究Oracle数据库,盖因公司的系统要么Oracle要么是mysql吧. 作为一个IT工作者,没有碰过Oracle是一件很匪夷所思得事情. 想到过去几年,乃至接触IT行业开始就只有玩过sql ...

  5. npm更新到最新版本的方法

    打开命令行工具 npm -v 查看是否是最新版本 如果不是 运行npm i npm g 升级 打开C:\Users\用户名用户目录找到node_modules 文件夹下的npm文件夹,复制一份 打开n ...

  6. 安卓开发之ListAdapter(二)

    今天我们来学习一下ArrayAdapter: ArrayAdapter是安卓中最简单的适配器.使用ArrayAdapter(数组适配器),需要把数据源存 放至数组里面来显示. •构造函数: publi ...

  7. 信息系统实践手记6-JS调用Flex的性能问题一例

    说明:信息系统实践手记系列是系笔者在平时研发中先后遇到的大小的问题,也许朴实和细微,但往往却是经常遇到的问题.笔者对其中比较典型的加以收集,描述,归纳和分享. 摘要:此文描述了笔者接触过的部分信息系统 ...

  8. iOS系列 基础篇 02 StoryBoard 故事板文件

    iOS基础 02 StoryBoard 故事板文件 目录: 1. 故事板的导航特点 2. 故事板中的Scene和Segue 3. 本文最后 在上篇HelloWorld工程中有一个Main.storyb ...

  9. 企业号微信支付 公众号支付 H5调起支付API示例代码 JSSDK C# .NET

    先看效果 1.本文演示的是微信[企业号]的H5页面微信支付 2.本项目基于开源微信框架WeiXinMPSDK开发:https://github.com/JeffreySu/WeiXinMPSDK 感谢 ...

  10. Hadoop技巧(01):插件,终端权限

    阅读目录 序 HDFS权限 系列索引 本文版权归mephisto和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作. 文章是哥(mephisto)写的,SourceLink 序 在ha ...