使用OnScrollListener回调处理自动加载更多

首先来分析下OnScrollListener的回调,

new OnScrollListener() {
        boolean isLastRow = false;    

        @Override
        public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
            //滚动时一直回调,直到停止滚动时才停止回调。单击时回调一次。
            //firstVisibleItem:当前能看见的第一个列表项ID(从0开始)
            //visibleItemCount:当前能看见的列表项个数(小半个也算)
            //totalItemCount:列表项共数    

            //判断是否滚到最后一行
            if (firstVisibleItem + visibleItemCount == totalItemCount && totalItemCount > 0) {
                isLastRow = true;
            }
        }
        @Override
        public void onScrollStateChanged(AbsListView view, int scrollState) {
            //正在滚动时回调,回调2-3次,手指没抛则回调2次。scrollState = 2的这次不回调
            //回调顺序如下
            //第1次:scrollState = SCROLL_STATE_TOUCH_SCROLL(1) 正在滚动
            //第2次:scrollState = SCROLL_STATE_FLING(2) 手指做了抛的动作(手指离开屏幕前,用力滑了一下)
            //第3次:scrollState = SCROLL_STATE_IDLE(0) 停止滚动
            //当屏幕停止滚动时为0;当屏幕滚动且用户使用的触碰或手指还在屏幕上时为1;
            //由于用户的操作,屏幕产生惯性滑动时为2  

            //当滚到最后一行且停止滚动时,执行加载
            if (isLastRow && scrollState == AbsListView.OnScrollListener.SCROLL_STATE_IDLE) {
                //加载元素
                ......    

                isLastRow = false;
            }
        }
    }  

项目开发中给listview添加一个footview的加载的自定义布局,如果还添加了headview的话,上面的代码需要修改下

totalItemCount > 0改成<pre name="code" class="java">totalItemCount > 2

然后在onScrollStateChange方法里面去加载数据的时候,加载完成listview的adapter去notify数据。

但是项目开发中发现个bug问题,就是加载的时候会加载两遍,分析原因发现onScroll方法执行了两次,就是在onScrollStateChange方法里的isLastRow被赋值为false后,然后onScroll方法又赋值成了true,所以会导致在onScrollStateChange方法里的加载数据会执行两遍,用什么方法解决呢?

我想到的方法是设置个全局变量,loading = true/false,表示还没加载完数据并且adapter没notify完成数据前loading为true,否则为false。但是listview的adapter如何知道notify数据完成了,我没发现有相关的Listener监听方法可以回调adapter的notify完成。但是我们知道每次notify数据的时候都会执行adapter里面的getview方法,特别是加载增加了数据列表时,所以我决定在getview方法里面添加

if(datas.size()-1==position){
       loading = false;
}

这样可以解决问题,如果有网友知道更好的方法,还请留言,感激不尽!

复制去Google翻译翻译结果

totalItemCount>0

时间: 2024-10-29 19:10:32

使用OnScrollListener回调处理自动加载更多的相关文章

ListView下拉刷新,上拉自动加载更多

下拉刷新,Android中非常普遍的功能.为了方便便重写的ListView来实现下拉刷新,同时添加了上拉自动加载更多的功能.设计最初是参考开源中国的Android客户端源码.先看示例图.          图1                                                                                                             图2          图3                      

探索SwipeRefreshLayout配合自定义ListView完成下拉刷新、滑到底部自动加载更多

在Android开发过程中经常需要实现上下拉刷新功能,Google推出的下拉刷新控件SwipeRefreshLayout(彩虹条),由于官方版本只有下拉刷新而没有上拉加载更多的功能,很多人也尝试在这个基础上进行改写.今天尝试一下使用SwipeRefreshLayout配合自定义ListView实现下拉刷新.滑到底部自动加载更多的功能. 效果图如下所示,在进入页面的时候加载自动刷新,滑到底部自动加载更多,当数据已经加载完成则显示已经加载完成,,否则上拉任可继续加载 先贴一下项目结构图吧,这样可能对

retrofit+rxjava+recyclerview+下拉刷新+自动加载更多

安卓开发过程中,网络请求与下拉刷新分页列表的控件几乎可以说是必不可少的,但是每次开发一款产品都要重新开发,肯定是不可取的,那么最好是可以自己整理一个开发框架,那么以后开发,直接引入项目即可 网络框架的封装,从httpclient,到xutils,再到volley,再到okhttp,每次整合都发现多多少少的不足,目前自己觉得最成熟的一个也就是retrofit+okhttp3+rxjava的组合,rxjava不懂的推荐看大神的深入浅出rxjava,retrofit的使用自己网上搜咯 下拉刷新列表的实

IOS学习之UiTableView下拉刷新与自动加载更多,百年不变的效果

IOS学习之UiTableView下拉刷新与自动加载更多,百年不变的效果(五) 五一劳动节马上来临,小伙伴有妹有很激动哟,首先祝天下所有的程序猿节日快乐!这个五一对于我来说有点不一样,我的人生从这个五一就转弯了,爱情长跑8年的我结婚了,一会支付宝账号我会公布出去,请自觉打款!谢谢合作. 灯光闪起来: 舞蹈跳起来: 歌曲唱起来: -------------------------------------------------------------------------------------

基于JQuery实现滚动到页面底端时自动加载更多信息

基于JQuery实现滚动到页面底端时自动加载更多信息 关键代码: 代码如下: var stop=true; $(window).scroll(function(){ totalheight = parseFloat($(window).height()) + parseFloat($(window).scrollTop()); if($(document).height() <= totalheight){ if(stop==true){ stop=false; $.post("ajax.

UWP-ListView到底部自动加载更多数据

ListView绑定的数据当需要“更多”时自动加载 ListView划到底部后,绑定的ObservableCollection列表数据需要加载的更多,或着ListView初始时,绑定的数据也需要自动加载(更多),实现一个接口 ISupportIncrementalLoading 即可: class A { } class AList: ObservableCollection<A>, ISupportIncrementalLoading { //实现这个方法即可,当需要数据时,就会执行这个方法

Android RecyclerView 瀑布流滑动到最后自动加载更多

mRecycleView.setOnScrollListener(new RecyclerView.OnScrollListener(){ //用来标记是否正在向最后一个滑动,既是否向下滑动 boolean isSlidingToLast = false; @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { StaggeredGridLayoutManager manager

jquery列表自动加载更多

<div id="list_box"></div> <div id="getMore" style="position:fixed; bottom:0; opacity:0.7; height:24px; line-height:24px; background:#fff; color:#000;">更多内容正在加载...</div> <script> var cur_page = 0;

Jquery鼠标滚动到页面底部自动加载更多内容,使用分页

https://www.cnblogs.com/qhorse/p/4717726.html index.php代码 [html] view plaincopy<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://