根据这个方法检测:
1 getListView().setOnScrollListener(new OnScrollListener() { 2 @Override 3 public void onScrollStateChanged(AbsListView view, int scrollState) { 4 } 5 6 @Override 7 public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { 8 if(firstVisibleItem==0){ 9 Log.e("log", "滑到顶部"); 10 } 11 if(visibleItemCount+firstVisibleItem==totalItemCount){ 12 Log.e("log", "滑到底部"); 13 } 14 } 15 });
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) 停止滚动