使用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-11-05 23:14:58

使用OnScrollListener回调处理自己主动载入很多其它的相关文章

Android实现RecyclerView的下拉刷新和上拉载入很多其它

需求 先上效果图, Material Design风格的下拉刷新和上拉载入很多其它. 源代码地址(欢迎star) https://github.com/studychen/SeeNewsV2 假设对于RecyclerView还不熟悉,參见这篇 Android Material Design学习之RecyclerView取代 ListView 本文链接 http://blog.csdn.net/never_cxb/article/details/50759109 转载请注明出处 下拉刷新 效果图

RecyclerView实现底部载入很多其它功能

这两天在公司没有什么任务分配,就研究了下咱们Google在Android5.0 推出的一个用来取代ListView的列表控件----RecyclerView. 发现功能上确实比ListView强大了不少,可扩展性也增强了不少. 可是使用过RecyclerView的Programmers应该都知道,RecyclerView无法直接代码加入头布局和脚布局. 那么他喵的怎么样实现最经常使用的底部载入很多其它数据呢?带着这种疑惑我在StackOverFlow上搜索到了一个有參考价值的答案并写了一个Dem

封装RecyclerViewAdapter实现RecyclerView下拉刷新上拉载入很多其它

实现 关于下拉刷新使用的是github上的项目Ultra Pull To Refresh项目. gradle依赖例如以下: compile 'in.srain.cube:ultra-ptr:1.0.11' 重点是上拉载入很多其它的实现.因为RecyclerView并不支持加入HeardView与FooterView,因此我们仅仅能自 己实现. 首先定义一些局部变量 public static final int STATE_LOAD = 0; public static final int ST

瀑布流点击载入很多其它(记住tomcat下启动,做过瀑布流的大家预计都知道为啥)

废话不多说.直接上代码:http://download.csdn.net/detail/cometwo/9387665 这个带淡出效果,比較高大上哦:http://download.csdn.net/detail/cometwo/9387971 通过打开/关闭凝视235行能够实现自己主动载入和点击载入很多其它.是一个瀑布流最经典的样例,全然 适用于各种瀑布流项目 <!DOCTYPE html> <html> <head> <meta http-equiv=&quo

跟着辛星认识一下PHP的自己主动载入

作为一个框架,文件的载入机制是不能少的,那么我们应该怎么载入呢,这些PHP已经给我们想好了,所以我们仅仅须要依照规则办事就能够了,PHP中有两个函数能够完毕这个功能,第一个是__autoload,如今已经非常少用了,取而代之的是功能更加强大的spl_autoload_register,它须要的版本号是PHP5.2.1之后的版本号,如今我们的主流版本号都是支持的,因此能够放心使用. 在曾经的PHP版本号中,我们往往须要require一堆的文件名称,比方配置文件.数据库连接文件.日志文件等等,后来我

辛星浅析yaf框架中的类的自己主动载入问题

因为公司非常多项目都是基于yaf的,而非常多刚接触yaf的朋友问的第一个问题就是:yaf的自己主动载入是依照什么规则来的. 鉴于此.于是我特别开了一篇博文来记录一下. 首先在yaf中.models文件夹下的全部类名都须要以Model结尾.并且全部models和全部library下的类名都要依据所处等级加前缀,比方说我在Db文件夹下有个Mysql文件夹下有一个QueryGrammar.php文件,那么这个文件里的类名就应该是Db_Mysql_QueryGrammar,我们在实例化的时候直接使用这个

OnScrollListener回调分析

new AbsListView.OnScrollListener() {       @Override   public void onScrollStateChanged(AbsListView view, int scrollState) {    switch (scrollState) {     case AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL:             // 手指触屏拉动准备滚动,只触发一次   

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

首先来分析下OnScrollListener的回调, new OnScrollListener() { boolean isLastRow = false; @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { //滚动时一直回调,直到停止滚动时才停止回调.单击时回调一次. //firstVisibleItem:当前能看见

启动网页时候自己主动载入servlet假设不使用strus最经常使用的两种方式

这是第一种使用的是onload方法当中的test是自己的servlet <html> <body onload = "test"> </body> </html> 以下是用的js调用servlet实现 <script language='javascript'> function test(){ window.open('','','')//參数可设你要调用的servlet, //可让此页面在台执行 } </script