我想知道用户何时滚动到列表视图的顶部或底部,他不能再滚动了。
现在我正在使用OnScrollListener来了解哪些listview项目可见。
listview.setOnScrollListener(new OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
if (scrollState == OnScrollListener.SCROLL_STATE_IDLE) {
}
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
if (totalItemCount - visibleItemCount == firstVisibleItem) {
//last item visible
}
if (firstVisibleItem == 0) {
//first item visible
}
}
});
答案 0 :(得分:10)
我通过检查第一个或最后一个项目的偏移量找到了解决方案,当这些项目的偏移量为0时,我们已经到达listview
的底部/顶部。
listview.setOnScrollListener(new OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
// TODO Auto-generated method stub
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
if (firstVisibleItem == 0) {
// check if we reached the top or bottom of the list
View v = listview.getChildAt(0);
int offset = (v == null) ? 0 : v.getTop();
if (offset == 0) {
// reached the top:
return;
}
} else if (totalItemCount - visibleItemCount == firstVisibleItem){
View v = listview.getChildAt(totalItemCount-1);
int offset = (v == null) ? 0 : v.getTop();
if (offset == 0) {
// reached the bottom:
return;
}
}
}
});
答案 1 :(得分:2)
试试这种方式
list.setOnScrollListener(new OnScrollListener() {
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
}
int mPosition=0;
int mOffset=0;
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
// TODO Auto-generated method stub
int position = list.getFirstVisiblePosition();
View v = list.getChildAt(0);
int offset = (v == null) ? 0 : v.getTop();
if (mPosition < position || (mPosition == position && mOffset < offset)){
// Scrolled up
} else {
// Scrolled down
}
}
});
答案 2 :(得分:0)
适配器getView方法调用
当你的位置等于数据大小列表视图时,检查位置,这样你就在列表的最后一个元素答案 3 :(得分:0)
@Override
public void onScrollChanged()
{
// We take the last son in the scrollview
View view = (View) scrollview.getChildAt(scrollview.getChildCount() - 1);
int diff = (view.getBottom() - (scrollview.getHeight() + scrollview.getScrollY()));
if (diff == 0 )
{
// bottom of the scrollview
}
}
答案 4 :(得分:0)
如果您将自定义适配器与您的 listview,然后使用并享受以下答案:
https://stackoverflow.com/a/55350409/1845404
适配器的getView方法检测列表何时滚动到最后一项。即使适配器已经渲染了最后一个视图之后,在调用某些较早位置的情况下,它也为罕见的情况增加了校正。