请注明出处: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
大家有什么建议,欢迎讨论!!!!