ListView的滑动监听,是ListView中最重要的技巧,很多重写ListView,基本都是在滑动事件的处理上下功夫,通过判断滑动事件进行不同的逻辑处理.为了更加精确地监听滑动事件,我们通常还需要GestureDetector手势识别,VelocityTracker滑动速度的检测等辅助类来完成更好的监听,下面是ListIView的滑动事件的方法,一个是通过OnTouchListener来实现监听,另一个是使用OnScrollListener来实现监听.
-OnTouchListener
onTouchListener是View中的监听事件,通过监听ACTION_DOWN,ACTION_MORE,ACTION_UP.这三个事件发生时的坐标,就可以根据坐标判断用户滑动的方向,并在不同的事件中进行相应的逻辑处理,这种方式的使用代码如下所示.
mListView.setOnTouchListener(new View.OnTouchListener()){
@Override public boolean onTouch(View v,MotionEvent event){
swicth(event.getAction()){
case:MotionEvent.ACTION_DOWN:
//触摸时操作
break;
case:MotionEvent.ACTION_MOVE:
//移动时操作
break;
case:MotionEvent.ACTION_MOVE:
//离开时操作
break;
}
}
return false;
}
-OnScrollListener
OnScollListener是AbsListView中的监听事件,它封装了很多与ListView相关的信息,用起来也更加灵活.首先来看一下OnScollListener的一般使用方法,代码如下所示:
mListView.setOnScrollListener(new AbsListView.OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
switch (scrollState){
case SCROLL_STATE_IDLE:
//滑动停止时调用
break;
case SCROLL_STATE_TOUCH_SCROLL:
//正在滚动时调用
break;
case SCROLL_STATE_FLING:
//手指快速滑动时,在离开ListView由于惯性滑动
break;
}
}
@Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
//滚动时一直调用
}
});
OnScrollListener中有两个回调方法-------onScrollStateChanged()和onScroll()
onScrollStateChanged这个方法根据他的参数srrollState来决定其回调的次数,scrollState有三种模式
SCROLL_STATE_IDLE: 滚动停止时
SCROLL_STATE_TOUCH_SCROLL 正在滚动时
SCROLL_STATE_FLING 手指快速滑动时,在离开ListView由于惯性滑动
当用户没有做手指抛动的状态时,这个方法只会回调2次,否则会回调3次,差别就是手指抛动的这个状态,通常情况下,我们在这个方法中通过不同的状态来设置一些Flag,来区分不同的滑动状态,供其他方法处理.
下面这个onScroll()这个回调方法,它在ListView滚动时会一直回调,而方法中的>后三个int类型
firstVisibleItem:当前能看到的第一个Item的ID(从0开始).
visibleItemCount:当前能看到的Item的总数
totalItemCount 整个ListView的Item的总数
这里需要注意的是,当前能看见的Item数,包括没有显示完整的Item,即显示一小半的Item也包括在内.通过这几个参数,可以很方便地进行一些判断.比如判断是否滚动到最后一行,就可以使用如下代码进行判断,当前可视的另一个Item的ID加上当前可视Item的和等于Item总数的时候,即滚动到了最后一行.
if(firstVisibleItem+visibleItemCount==totalItemCount&&totalItemCount>0)
{
//滚动到最后一行,在这里可以处理ListView上拉加载更多
}
好了这就是有关ListView的滑动监听.在这里记录下来.希望对大家有所帮助.