1、onTouchListener
onTouchListener是View中的监听事件,通过监听ACTION_DOWN、ACTION_MOVE、ACTION_UP这三个事件发生时的坐标,判断用户滑动的方向,在不同的事件中进行相应的逻辑处理。
listview.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
//触摸时操作
break;
case MotionEvent.ACTION_MOVE:
//移动时操作
break;
case MotionEvent.ACTION_UP:
//离开时操作
break;
default:
break;
}
return false;
}
});
2、onScrollListener
onScrollListener是AbsListView中的监听事件,封装了很多与listView相关的信息,使用起来很灵活
listview.setOnScrollListener(new OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
// TODO Auto-generated method stub
switch (scrollState) {
case OnScrollListener.SCROLL_STATE_IDLE:
//滑动停止时
Log.d("Test", "SCROLL_STATE_IDLE");
break;
case OnScrollListener.SCROLL_STATE_TOUCH_SCROLL:
//正在滚动
Log.d("Test", "SCROLL_STATE_TOUCH_SCROL");
break;
case OnScrollListener.SCROLL_STATE_FLING:
//手指用力滑动
//手指离开listview后由于惯性继续滑动
Log.d("Test", "SCROLL_STATE_FLING");
break;
default:
break;
}
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
// TODO Auto-generated method stub
//滑动过程一直调用
Log.d("Test", "onScroll");
}
});
可以写一个测试demo观察Logcat输出信息,即非常直观地看到滑动过程各个函数的调用情况。
下面看看onScroll这个回调方法,这个方法在listview滚动过程中一直调用,三个参数分别为:
firstVisibleItem:当前能看见的第一个Item的ID
visibleItemCount:当前能看见的Item总数
totalItemCount:整个listview的item总数
如果需要判断当前是否滚动到最后一行,方法是:当前可视的第一个item的ID加上当前可视item的和等于item总数的时候,即滚动到了最后一行。
if(firstVisibleItem + visibleItemCount == totalItemCount && totalItemCount>0)
{
//滚动到最后一行了。
}
如果需要判断滚动方向:
if(firstVisibleItem > lastVisibleItemPosition)
{
//上滑
}else if(firstVisibleItem < lastVisibleItemPosition)
{
//下滑
}
lastVisibleItemPosition = firstVisibleItem;
ListView也提供了一些封装的方法来获得当前可视的Item的位置等信息。
mListView.getLastVisiblePosition();
mListView.getFirstVisiblePosition();