关于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. thinkphp怎么修改配置进入默认首页

    thinkphp文件夹下config 里面有个convention.php文件 里面有三个配置 'DEFAULT_MODULE' => 'Home', // 默认模块 'DEFAULT_CONT ...

  2. 浅谈Static关键字

    1.使用static关键字声明的属性为全局属性 未使用static关键字指定city之前,如果需要将Tom,Jack,Mary三人的城市均改成Beijing,需要再次声明三次对象的city为Beiji ...

  3. python调用py中rar的路径问题。

    1.python调用py,在py中的os.getcwd()获取的不是py的路径,可以通过os.path.split(os.path.realpath(__file__))[0]来获取py的路径. 2. ...

  4. spring框架之javaconfig

    简介:随着java5的推出,加上当年基于纯java annotation的依赖注入框架Guice的出现,spring推出并持续完善了基于java代码和annotation元信息的依赖关系绑定描述方法, ...

  5. Java集合-Python数据结构比较

    Java list与Python list相比较 Java List:有序的,可重复的.(有序指的是集合中对象的顺序与添加顺序相同) Python list(列表)是有序的,可变的. Java Lis ...

  6. Java设计模式——线程安全的单件模式

    单件模式,也称单例模式,用以创建独一无二的.只能有一个实例的对象. 单件模式的类图是所有模式的类图中最简单的--只有一个类.尽管从类设计的视角来看单件模式很简单,但是实现上还是会遇到一些问题,本文着重 ...

  7. 调试关于Hibernate的程序遇到的问题

    最怕的就是初学一些东西,低级的错误犯了又犯,现在总结出来以便以后不要再犯类似的错误. 一.Hibernate的延迟加载机制 在用hibernate底层访问数据库的过程忽略了延迟加载机制导致 在访问时候 ...

  8. 数据可视化案例 | 如何打造数据中心APP产品

    意识到数据探索带来的无尽信息,越来越多的企业开始建立自有的数据分析平台,打造数据化产品,实现数据可视化. 在零售商超行业,沃尔玛"啤酒与尿布"的故事已不再是传奇.无论是大数据还是小 ...

  9. Tomcat 配置详解/优化方案

     转自:http://blog.csdn.net/cicada688/article/details/14451541 Service.xml Server.xml配置文件用于对整个容器进行相关的配置 ...

  10. 从 HTTP 到 HTTPS - 什么是 HTTPS

    这篇文章首发于我的个人网站:听说 - https://tasaid.com/,建议在我的个人网站阅读,拥有更好的阅读体验. 这篇文章与 博客园 和 Segmentfault 共享. 前端开发QQ群:3 ...