“判断listview的最后一项是否完全显示”的其逻辑推理和用到的API讲解,及普遍的错误使用

请注明出处:http://blog.csdn.net/daogepiqian/article/details/50538191

先上代码,这个是网上都说的方法,但是!!是有问题的!!听后面本人的讲解,不信可试验验证。

  public static boolean isLastItemVisible() {
  Adapter adapter = mListView.getAdapter();
  if (null == adapter || adapter.isEmpty()) {
   return true;
  }
  final int lastItemPosition = adapter.getCount() - 1;//listview中position最大值,即最后一个

  final int lastVisiblePosition = mListView.getLastVisiblePosition();//listview中最后一个显示的position
  
  if (lastVisiblePosition >= lastItemPosition - 1) { //判断出是否是最后一个,lastVisiblePosition == lastItemPosition,但是包含footer时,lastVisiblePosition = lastItemPosition - 1
   final int childIndex = lastVisiblePosition - mListView.getFirstVisiblePosition();//
   
   final int childCount = mListView.getChildCount();//获取listview上显示的item属相
 
   final int index = Math.min(childIndex, childCount - 1);
   final View lastVisibleChild = mListView.getChildAt(index);
   if (lastVisibleChild != null) {
    return lastVisibleChild.getBottom() <= mListView.getBottom();//最后一个是否显示完全
   }
  }
  return false;
 }


listview的position是从0开始计算的,也就是最后一个tiem的position = 总数-1

adapter.getCount()返回的是listview中item的数量。

mListView.getLastVisiblePosition()则返回的是当前界面显示的最有一项的position,包含未完全显示的项。

因此当没有header和footer的时候,lastVisiblePosition = lastItemPosition;即lastVisiblePosition  = listview总数量-1;


mListView.addHeaderView(LayoutInflater.from(this).inflate(R.layout.list_footer, null));

当加了一个header

当有header时,相当于多加了一项,listview的数量adapter.getCount()+1,并且 每项的position也都+1,因此lastVisiblePosition  也就增加了

如果两个header 就再加+1


但是如果mListView.addFooterView(LayoutInflater.from(this).inflate(R.layout.list_footer, null));

虽然相当于多加了一项,listview总数量也加了,但是因为加的项是在  底部  因此

在最后一项显示的时候是lastVisiblePosition = lastItemPosition - 1,只是在footer显示的时候才是lastVisiblePosition = lastItemPosition ;

因此最后一项的初步判断是lastVisiblePosition = lastItemPosition - 1


ListView.getChildAt(index)是获取当前屏幕上显示的某一项,目前只发现childIndex= childCount - 1的情况,也不知道什么情况不相等。有谁知道,我想请教一下问问,

只是当前一屏内的,参数从0到mListView.getLastVisiblePosition()- mListView.getFirstVisiblePosition()


final View lastVisibleChild = mListView.getChildAt(index);获取屏幕中index的一项


ListView.getBottom()是显示listview底层的距离,当listview的显示的最后一项没完全显示的时候,其绘制到屏幕外界,距离超出了listview的底部,

因此用lastVisibleChild.getBottom() <= mListView.getBottom();来判断最后一项是否完全显示。


不知道大家发现问题没有,当有footer的时候,lastVisiblePosition = lastItemPosition - 1的时候也是可以的,大家可以试试,倒数第二项完全显示的时候,且倒数第一项完全不显示的时候,isLastItemVisible也是返回true的,因此这个判断if (lastVisiblePosition >= lastItemPosition - 1)说要更改的,虽然说这个bug很难触发。

请注明出处:http://blog.csdn.net/daogepiqian/article/details/50538191

大家有什么建议,欢迎讨论!!!!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值