首先来分析下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;
}

这样能够解决这个问题。假设有网友知道更好的方法,还请留言,感激不尽!

totalItemCount>0

最新文章

  1. 聊聊 C 语言中的 sizeof 运算
  2. python基础06 循环
  3. php crc32,md5,sha1,mhash测试结果
  4. 工具fiddler学习
  5. 功能更新到 Windows 10 企业版, 版本 1607
  6. Longest Common Substring
  7. JavaScript基础12——js的方法重载
  8. show slave各项参数解释
  9. Javascript操作剪切板数据(支持IE、Chrome、360、搜狗),亲测!
  10. labview中的文件格式
  11. MYSQL 调优系列
  12. error LNK2019: 解析的外部符号 __imp__DispatchMessageW@4,在函数的符号 _WinMain@16 据引述
  13. ODP.NET
  14. vim编辑器的简单使用
  15. move_uploaded_file
  16. WPF中使用后台代码来控制TreeView的选择项(SelectedItem)以及展开节点操作
  17. Django--CRM--菜单排序等
  18. oracle数据入库出现空格问题
  19. 用python一起来看流星雨
  20. MANIPULATION

热门文章

  1. VMware搭建内网并通过iptables端口转发联网
  2. ZZULIoj 1908 小火山的围棋梦想
  3. ES6(对象扩展)
  4. (转)php_curl模拟登录有验证码实例
  5. Android GradientDrawable的XML实现
  6. Kubernetes网络设计原则
  7. Linux基础之vi编辑器(二)
  8. 洛谷P1771 方程的解_NOI导刊2010提高(01)
  9. [NOIP1999] 普及组
  10. SyntaxError: expected expression, got &#39;&lt;&#39;异常错误