Android 如何 ListView 判断滚动到最顶部或者底部
2017-05-19 11:03
501 查看
转自:http://blog.csdn.net/wangbaochu/article/details/50630371
如何判断 ListView 滑动到顶部和底部?网上一搜,最多的答案都是这样的:
[java] view
plain copy
![](https://oscdn.geek-share.com/Uploads/Images/Content/201611/a7c8e286f463007e2a900848b93dd72c.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201611/9e12f1d3e499fc949c886e7c9e0484f9)
mListView.setOnScrollListener(new AbsListView.OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
if (firstVisibleItem == 0) {
Log.d("ListView", "##### 滚动到顶部 #####");
} else if ((firstVisibleItem + visibleItemCount) == totalItemCount) {
Log.d("ListView", "##### 滚动到底部 ######");
}
}
});
这一段代码并不能够精确地判断 ListView 是否到达最顶部或者最底部。因为只要ListView中第一个item出现在屏幕上端,即使只出现一部分,firstVisibleItem 的值也依然为0, onScroll()回调就会发生; 同样ListView 的最后一个 item 即使只显示一部分,((firstVisibleItem + visibleItemCount) ==
totalItemCount) 的值也是等于totalItemCount。
那么倒底如何精确判断 ListView 是否滚动到顶部或者底部?
一、首先想到的是 ListView.onScrollChanged()
这个函数是protected,直接引用不到,但是可以继承ListView类,然后重写这个函数:
[java] view
plain copy
![](https://oscdn.geek-share.com/Uploads/Images/Content/201611/a7c8e286f463007e2a900848b93dd72c.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201611/9e12f1d3e499fc949c886e7c9e0484f9)
@Override
protected void onScrollChanged(int l, int t, int oldl, int oldt) {
super.onScrollChanged(l, t, oldl, oldt);
Log.d("ListView", String.format("onScrollChanged: l = %d, t = %d, oldl = %d, oldt = %d, ScrollY = %d", l, t, oldl, oldt, this.getScrollY()));
if (t == 0) {
Log.d("ListView", "onScrollChanged <----滚动到顶部----->");
}
}
经过测试发现:ListView的 onScrollChanged() 以及 getScrollX() 和 getScrollY() 总是返回0,根本不起作用。但是对于Android
ScrollView 这三个函数都是有效的,为什么ListView就不起作用呢?尼玛,绝对没有想到Android 这么坑爹!
可以参看 http://stackoverflow.com/questions/24856063/listview-onscrollchanged-always-returns-0
二、只能继续改进 ListView.setOnScrollListener()
1. 改进是否滚动到顶部:增加判断第一个 item 距离 ListView 顶部的距离是否为 0
[java] view
plain copy
![](https://oscdn.geek-share.com/Uploads/Images/Content/201611/a7c8e286f463007e2a900848b93dd72c.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201611/9e12f1d3e499fc949c886e7c9e0484f9)
if (firstVisibleItem == 0) {
View firstVisibleItemView = mListView.getChildAt(0);
if (firstVisibleItemView != null && firstVisibleItemView.getTop() == 0) {
Log.d("ListView", "##### 滚动到顶部 ######");
}
}
2. 改进是否滚动到底部:增加判断当前屏幕中可见的最后一个 item 的底端距离 ListView 的顶端是否为 ListView 的高度:
[java] view
plain copy
![](https://oscdn.geek-share.com/Uploads/Images/Content/201611/a7c8e286f463007e2a900848b93dd72c.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201611/9e12f1d3e499fc949c886e7c9e0484f9)
if ((firstVisibleItem + visibleItemCount) == totalItemCount) {
View lastVisibleItemView = mListView.getChildAt(mListView.getChildCount() - 1);
if (lastVisibleItemView != null && lastVisibleItemView.getBottom() == mListView.getHeight()) {
Log.d("ListView", "##### 滚动到底部 ######");
}
}
全部完整代码如下:
[java] view
plain copy
![](https://oscdn.geek-share.com/Uploads/Images/Content/201611/a7c8e286f463007e2a900848b93dd72c.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201611/9e12f1d3e499fc949c886e7c9e0484f9)
mListView.setOnScrollListener(new OnScrollListener() {
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
if (firstVisibleItem == 0) {
View firstVisibleItemView = mListView.getChildAt(0);
if (firstVisibleItemView != null && firstVisibleItemView.getTop() == 0) {
Log.d("ListView", "##### 滚动到顶部 #####");
}
} else if ((firstVisibleItem + visibleItemCount) == totalItemCount) {
View lastVisibleItemView = mListView.getChildAt(mListView.getChildCount() - 1);
if (lastVisibleItemView != null && lastVisibleItemView.getBottom() == mListView.getHeight()) {
Log.d("ListView", "##### 滚动到底部 ######");
}
}
}
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
//do nothing
}
});
![](https://oscdn.geek-share.com/Uploads/Images/Content/201701/9cc493f1e15b23d0f4eaea0d0f8b35d0.png)
经过测试发现:上述代码能够正确判断 ListView 是否滚动到顶部或者底部
如何判断 ListView 滑动到顶部和底部?网上一搜,最多的答案都是这样的:
[java] view
plain copy
![](https://oscdn.geek-share.com/Uploads/Images/Content/201611/a7c8e286f463007e2a900848b93dd72c.png)
mListView.setOnScrollListener(new AbsListView.OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
if (firstVisibleItem == 0) {
Log.d("ListView", "##### 滚动到顶部 #####");
} else if ((firstVisibleItem + visibleItemCount) == totalItemCount) {
Log.d("ListView", "##### 滚动到底部 ######");
}
}
});
这一段代码并不能够精确地判断 ListView 是否到达最顶部或者最底部。因为只要ListView中第一个item出现在屏幕上端,即使只出现一部分,firstVisibleItem 的值也依然为0, onScroll()回调就会发生; 同样ListView 的最后一个 item 即使只显示一部分,((firstVisibleItem + visibleItemCount) ==
totalItemCount) 的值也是等于totalItemCount。
那么倒底如何精确判断 ListView 是否滚动到顶部或者底部?
一、首先想到的是 ListView.onScrollChanged()
这个函数是protected,直接引用不到,但是可以继承ListView类,然后重写这个函数:
[java] view
plain copy
![](https://oscdn.geek-share.com/Uploads/Images/Content/201611/a7c8e286f463007e2a900848b93dd72c.png)
@Override
protected void onScrollChanged(int l, int t, int oldl, int oldt) {
super.onScrollChanged(l, t, oldl, oldt);
Log.d("ListView", String.format("onScrollChanged: l = %d, t = %d, oldl = %d, oldt = %d, ScrollY = %d", l, t, oldl, oldt, this.getScrollY()));
if (t == 0) {
Log.d("ListView", "onScrollChanged <----滚动到顶部----->");
}
}
经过测试发现:ListView的 onScrollChanged() 以及 getScrollX() 和 getScrollY() 总是返回0,根本不起作用。但是对于Android
ScrollView 这三个函数都是有效的,为什么ListView就不起作用呢?尼玛,绝对没有想到Android 这么坑爹!
可以参看 http://stackoverflow.com/questions/24856063/listview-onscrollchanged-always-returns-0
二、只能继续改进 ListView.setOnScrollListener()
1. 改进是否滚动到顶部:增加判断第一个 item 距离 ListView 顶部的距离是否为 0
[java] view
plain copy
![](https://oscdn.geek-share.com/Uploads/Images/Content/201611/a7c8e286f463007e2a900848b93dd72c.png)
if (firstVisibleItem == 0) {
View firstVisibleItemView = mListView.getChildAt(0);
if (firstVisibleItemView != null && firstVisibleItemView.getTop() == 0) {
Log.d("ListView", "##### 滚动到顶部 ######");
}
}
2. 改进是否滚动到底部:增加判断当前屏幕中可见的最后一个 item 的底端距离 ListView 的顶端是否为 ListView 的高度:
[java] view
plain copy
![](https://oscdn.geek-share.com/Uploads/Images/Content/201611/a7c8e286f463007e2a900848b93dd72c.png)
if ((firstVisibleItem + visibleItemCount) == totalItemCount) {
View lastVisibleItemView = mListView.getChildAt(mListView.getChildCount() - 1);
if (lastVisibleItemView != null && lastVisibleItemView.getBottom() == mListView.getHeight()) {
Log.d("ListView", "##### 滚动到底部 ######");
}
}
全部完整代码如下:
[java] view
plain copy
![](https://oscdn.geek-share.com/Uploads/Images/Content/201611/a7c8e286f463007e2a900848b93dd72c.png)
mListView.setOnScrollListener(new OnScrollListener() {
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
if (firstVisibleItem == 0) {
View firstVisibleItemView = mListView.getChildAt(0);
if (firstVisibleItemView != null && firstVisibleItemView.getTop() == 0) {
Log.d("ListView", "##### 滚动到顶部 #####");
}
} else if ((firstVisibleItem + visibleItemCount) == totalItemCount) {
View lastVisibleItemView = mListView.getChildAt(mListView.getChildCount() - 1);
if (lastVisibleItemView != null && lastVisibleItemView.getBottom() == mListView.getHeight()) {
Log.d("ListView", "##### 滚动到底部 ######");
}
}
}
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
//do nothing
}
});
![](https://oscdn.geek-share.com/Uploads/Images/Content/201701/9cc493f1e15b23d0f4eaea0d0f8b35d0.png)
经过测试发现:上述代码能够正确判断 ListView 是否滚动到顶部或者底部
相关文章推荐
- android 的ListView中,如何判断其内容已滚动到最顶部或者最底部?
- android 的ListView中,如何判断其内容已滚动到最顶部或者最底部
- android 的ListView中,如何判断其内容已滚动到最顶部或者最底部?
- android 的ListView中,如何判断其内容已滚动到最顶部或者最底部?
- Android 如何 ListView 判断滚动到最顶部或者底部
- Android 如何 ListView 判断滚动到最顶部或者底部 ,首行距离屏幕边缘距离
- android正确判断 ListView 是否滚动到顶部或者底部
- android 的ListView中,如何判断其内容已滚动到最顶部、底部
- android 的ListView中,判断其已滚动到最顶部或者最底部?
- android 的ListView中,如何判断其内容已滚动到最顶部、底部
- Android的ListView中判断其内容已滚动到最顶部或者最底部
- Android判断ListView滚动到最顶部第0条item完全完整可见及最底部最后一条item完全完整可见
- ListView判断其内容已滚动到最顶部或者最底部
- Android判断ListView滚动到最顶部第0条item完全完整可见及最底部最后一条item完全完整可见
- Android判断ListView滚动到最顶部第0条item完全完整可见及最底部最后一条item完全完整可见
- Android判断ListView滚动到最顶部第0条item完全完整可见及最底部最后一条item完全完整可见
- android ListView滚动条监听判断滚动到底部还是顶部
- android ListView滚动条监听判断滚动到底部还是顶部
- Android 如何判断ListView的滚动方向
- android 判断ListView滚动到底部