您的位置:首页 > 移动开发 > Android开发

android 的ListView中,如何判断其内容已滚动到最顶部或者最底部?

2015-03-31 22:33 381 查看
根据这个方法检测:

getListView().setOnScrollListener(new 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.e("log", "滑到顶部");
}
if(visibleItemCount+firstVisibleItem==totalItemCount){
Log.e("log", "滑到底部");
}
}
});


from:http://ask.csdn.net/questions/459

这是另外一种 在底部

listView.setOnScrollListener(new OnScrollListener() {

@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
// 当不滚动时
if (scrollState == OnScrollListener.SCROLL_STATE_IDLE) {
//判断是否滚动到底部
if (view.getLastVisiblePosition() == view.getCount() - 1) {
adapter.count += 10;
adapter.notifyDataSetChanged();
int currentPage=adapter.count/10;
Toast.makeText(getApplicationContext(), "第"+currentPage+"页", Toast.LENGTH_LONG).show();
}
}
}

@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
// TODO Auto-generated method stub

}
});


ListView实现滑动到底部加载更多

平时刷网页的时候当我们滑动到网页底部,网页会自动加载更多数据方便我们的浏览,比较典型的例子就是Twitter。

在安卓上也可以看见这样的设计,尤其被使用在
ListView
中。当ListView滑动到底部的时候会显示进度条并且加载更多数据。

实现这个功能的方法很简单,只需要调用
ListView
setOnScrollListener()
方法即可。

调用
setOnScrollListener()
方法需要重写两个方法,一个是
onScrollStateChanged()
方法,用来判断
ListView
当前的滑动状态;一个是
onScroll()
方法,用来检测
ListView
当前的视图状态。在这里我们只需要使用
onScroll()
方法即可。详细的过程见下方的代码和注释。

listView.setOnScrollListener(new AbsListView.OnScrollListener() {
/*
* 定义一个布尔变量,
* 用于判断滑动方向是否向下
*/
private boolean moveToBottom = false;

/*
* 定义一个整型变量,
* 用于记录ListView之前可见的第一个列表项的索引值,
* 主要用于判断ListView的滑动方向是否向下,
* 具体的使用方法见下方
*/
private int previous = 0;

@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
/* 什么也不需要做 */
}

/*
* view指报告当前状态的视图;
* firstVisibleItem表示ListView当前可见的第一个列表项的索引值;
* visibleItemCount表示ListView当前可见的列表项的个数;
* totalItemCount表示ListView总共的列表项个数
*
* 当ListView滑动到底部的时候,
* totalItemCount == firstVisibleItem + visibleItemCount;
* 但是满足上述条件时ListView却不一定是向下滑动的,
* 所以我们需要加入一个判断向下滑动的条件,
* 只需要循环对比ListView之前可见的第一个列表项的索引值previous和当前可见的第一个列表项的索引值firstVisibleItem,
* 当previous < firstVisibleItem时列表向下滑动,
* 当previous > firstVisibleItem时列表向上滑动,
* 记住对比结束之后要将firstVisibleItem赋值给previous,
* 方便下次比较
*/
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
if (previous < firstVisibleItem) {
moveToBottom = true;
} else if (previous > firstVisibleItem) {
moveToBottom = false;
}
previous = firstVisibleItem;

if (totalItemCount == firstVisibleItem + visibleItemCount && moveToBottom) {
/* 需要加载更多数据的代码 */
}
}
});


底部自动加载适用于分页加载大量数据,但是当数据量较小时这个功能反而成了累赘,比如说全部的数据量可能也就一个屏幕大小,只要稍微向下滑动一下就会开始加载,但是这样的加载却是不必要的。解决这个问题的方法也很简单,只需要修改一下加载更多的判断条件,当
totalItemCount
小于某个值的时候就不加载数据了;类似地你也可以指定数据量,当达到
totalItemCount
达到某个数据量的时候就不加载数据了。

from:http://mthli.github.io/post/ListView%E5%AE%9E%E7%8E%B0%E6%BB%91%E5%8A%A8%E5%88%B0%E5%BA%95%E9%83%A8%E5%8A%A0%E8%BD%BD%E6%9B%B4%E5%A4%9A.html

SCROLL_STATE_FLING,这个参数表示你手离开后ListView还在“飞”中,理解?
SCROLL_STATE_IDLE,这个参数表示ListView停下不动了
SCROLL_STATE_TOUCH_SCROLL,这个参数表示你手还在ListView上

//第1次:scrollState = SCROLL_STATE_TOUCH_SCROLL(1) 正在滚动
//第2次:scrollState = SCROLL_STATE_FLING(2) 手指做了抛的动作(手指离开屏幕前,用力滑了一下)
//第3次:scrollState = SCROLL_STATE_IDLE(0) 停止滚动
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐