关于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. HTML5笔记1——HTML5的发展史及标签的改变

    记得第一次接触HTML5还是在<联信永益>实习那会儿(2011),当时一个项目技术选型的时候面临两种选择,分别是Silverlight和HTML5,那是用的最新的IE浏览器版本还是IE9, ...

  2. spring mvc返回json字符串的方式

    spring mvc返回json字符串的方式 方案一:使用@ResponseBody 注解返回响应体 直接将返回值序列化json            优点:不需要自己再处理 步骤一:在spring- ...

  3. SVG Path高级教程

    课程分为四个方面: 1. Path概述 2. 移动和直线命令 3. 弧线命令 4. 贝塞尔曲线命令 Path概述 <path> 标签用来定义路径,Path字符串是由命令及其参数组组成的字符 ...

  4. GitHub Pages 绑定二级域名

    Updated: 2016.06.22 网上搜出一大把,很多还是重复转载的文章,关键是步骤很麻烦,比如:要注册 DNSPod,要 Ping IP(感觉不靠谱,IP是可以变的). 后来看了官方帮助,其它 ...

  5. bootstrap杂记

    http://v3.bootcss.com/ 这个国内的中文站点资料很全 如下看个页面的大体框架 http://www.cnblogs.com/sunhaoyu/p/4275190.html < ...

  6. 使用WebRTC搭建前端视频聊天室——信令篇

    博客原文地址 建议看这篇之前先看一下使用WebRTC搭建前端视频聊天室——入门篇 如果需要搭建实例的话可以参照SkyRTC-demo:github地址 其中使用了两个库:SkyRTC(github地址 ...

  7. 9套Android实战经典项目资料分享给大家

    通过项目学习收获更大. 1.基于Android平台实战爱短信项目 下载地址:http://pan.baidu.com/s/1hr8CEry 2.Android平台实战CRM客户关系管理(AChartE ...

  8. 细分java环境中的JDK、JVM、JRE

    细分java环境中的JDK.JVM.JRE 近来小看了下Android,扑面而来一堆概念JDK.JVM.JRE.SDK.NDK.ADT.缕了一下,其中JDK.JVM.JRE是java环境的东西,而SD ...

  9. 关于Xcode8打印一堆log问题

    最近太忙了,一直没时间 写博客,项目基本搞完了,这几天没事多写几篇博客.欢迎加群交流iOS技术,QQ交流群:45992174. 刚装的xcode8,不知道从哪来的一堆log 去除方法:Xcode8-- ...

  10. GCD的相关函数使用

    GCD 是iOS多线程实现方案之一,非常常用 英文翻译过来就是伟大的中枢调度器,也有人戏称为是牛逼的中枢调度器 是苹果公司为多核的并行运算提出的解决方案 1.一次性函数 dispatch_once 顾 ...