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; } });
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"); } });
下面看看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();