Android判断ListView滚动到最顶部第0条item完全完整可见及最底部最后一条item完全完整可见

51 篇文章 0 订阅
Android判断ListView滚动到最顶部第0条item完全完整可见及最底部最后一条item完全完整可见


给Android的ListView增加一个OnScrollListener监听事件:
[java]  view plain copy
  1. mListView.setOnScrollListener(new OnScrollListener() {  
  2.   
  3.   
  4.             private int firstVisibleItem, visibleItemCount, totalItemCount;  
  5.   
  6.   
  7.             @Override  
  8.             public void onScroll(AbsListView view, int firstVisibleItem,  
  9.                     int visibleItemCount, int totalItemCount) {  
  10.   
  11.   
  12.                 this.firstVisibleItem = firstVisibleItem;  
  13.                 this.visibleItemCount = visibleItemCount;  
  14.                 this.totalItemCount = totalItemCount;  
  15.             }  
  16.   
  17.   
  18.             @Override  
  19.             public void onScrollStateChanged(AbsListView view, int scrollState) {  
  20.                 if (scrollState == OnScrollListener.SCROLL_STATE_IDLE){  
  21.                     if(firstVisibleItem == 0){  
  22.                         //开始下拉见顶刷新  
  23. }  
  24.   
  25.   
  26. if(mListView.getLastVisiblePosition()== (totalItemCount-1)){  
  27. //开始上拉见底刷新  
  28. }  
  29. }  
  30.                   
  31.             }  
  32.         });  
  33.       


追踪firstVisibleItem, visibleItemCount, totalItemCount的值得变化,有一个情况,这在自己写下拉刷新或者上拉刷新时候容易暴露出来,比如,代码目的是下拉见顶时候刷新,但是,ListView的机制将某一个item比如第一个item只要出现在可见视野不管是全部还是部分,都讲firstVisibleItem赋值为该item的position值,这在下拉/上拉刷新时候容易造成混淆,比如,ListView下拉见顶刷新出新数据后,如果此时手指稍稍往下滑一丁点儿(注意!此时顶部的第一条元素没有完全滚动出视野,而是部分被遮挡,但仍有部分item的view部分仍在可见视野内),此时停下手指不再滑动触发ListView的滚动事件,那么此时将再次进入OnScrollListener事件,同时
scrollState == OnScrollListener.SCROLL_STATE_IDLE
仍然成立!同时firstVisibleItem的值依然是0!这将再次触发刷新加载事件!
上拉见底部情况相同。
这显然不是一种完善的下拉或者上拉刷新的体验和设计。为解决此问题,可以在OnScrollListener内的事件回调监测方法内增加代码:
[java]  view plain copy
  1. //isTop:true表示ListView完全見頂部。isBottom:true,listview完全見底。  
  2.             boolean isTop = false, isBottom = false;  
  3.             if ((visibleItemCount > 0) && (firstVisibleItem == 0)) {  
  4.                 if (view.getChildAt(0).getTop() >= 0) {  
  5.                     isTop = true;  
  6.                 }  
  7.             } else if ((totalItemCount > 0)  
  8.                     && (view.getLastVisiblePosition() == totalItemCount - 1)) {  
  9.                 if (view.getBottom() == view.getChildAt(  
  10.                         view.getChildCount() - 1).getBottom()) {  
  11.                     isBottom = true;  
  12.                 }  
  13.             }  




isTop为true则表示此时的ListView的第一条元素position=0,并且此时position=0的item完全完整显示在可见视野内(不是部分遮掩,不是部分显示)。与此相同,isBottom为true时候,表示此时的ListView最后一条元素完全完整的显示在可见视野内容。


相关文章:
《Android ListView下拉/上拉刷新:设计原理与实现》链接地址:http://blog.csdn.net/zhangphil/article/details/47036177

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值