欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android ListView监听滑动事件的方法(详解)

程序员文章站 2023-11-21 10:43:05
listview的主要有两种滑动事件监听方法,ontouchlistener和onscrolllistener 1、ontouchlistener ontouchlis...

listview的主要有两种滑动事件监听方法,ontouchlistener和onscrolllistener

1、ontouchlistener

ontouchlistener方法来自view中的监听事件,可以在监听三个action事件发生时通过motionevent的getx()方法或gety()方法获取到当前触摸的坐标值,来对用户的滑动方向进行判断,并可在不同的action状态中做出相应的处理

mlistview.setontouchlistener(new view.ontouchlistener() {
      @override
      public boolean ontouch(view v, motionevent event) {
        switch (event.getaction()) {
          case motionevent.action_down:
            // 触摸按下时的操作

            break;
          case motionevent.action_move:
            // 触摸移动时的操作

            break;
          case motionevent.action_up:
            // 触摸抬起时的操作

            break;
        }
        return false;
      }
 });

不仅仅只有上面的三种action状态,motionevent类中还定义了很多其它状态,我们可以灵活的使用这些状态

• motionevent.action_down:开始触摸

• motionevent.action_move:触摸移动

• motionevent.action_up:触摸抬起

• motionevent.action_outside:触摸范围超过了ui边界

• motionevent.action_cancel:触摸被取消时

• motionevent.action_pointer_down:当有另外一个触摸按下时(多点触摸)

• motionevent.action_pointer_up:当另一个触摸抬起时(多点触摸)

2、onscrolllistener

onscrolllistener来自abslistview中的监听事件,因为listview直接继承自abslistview,所以在abslistview中有很多listview相关信息

onscrolllistener中有两个回调方法

• public void onscrollstatechanged(abslistview view, int scrollstate):监听滑动状态的改变

• public void onscroll(abslistview view, int firstvisibleitem, int visibleitemcount, int totalitemcount):监听滑动

在源码中有其详细的解释

  /**
   * interface definition for a callback to be invoked when the list or grid
   * has been scrolled.
   */
  public interface onscrolllistener {

    /**
     * the view is not scrolling. note navigating the list using the trackball counts as
     * being in the idle state since these transitions are not animated.
     */
    public static int scroll_state_idle = 0;

    /**
     * the user is scrolling using touch, and their finger is still on the screen
     */
    public static int scroll_state_touch_scroll = 1;

    /**
     * the user had previously been scrolling using touch and had performed a fling. the
     * animation is now coasting to a stop
     */
    public static int scroll_state_fling = 2;

    /**
     * callback method to be invoked while the list view or grid view is being scrolled. if the
     * view is being scrolled, this method will be called before the next frame of the scroll is
     * rendered. in particular, it will be called before any calls to
     * {@link adapter#getview(int, view, viewgroup)}.
     *
     * @param view the view whose scroll state is being reported
     *
     * @param scrollstate the current scroll state. one of
     * {@link #scroll_state_touch_scroll} or {@link #scroll_state_idle}.
     */
    public void onscrollstatechanged(abslistview view, int scrollstate);

    /**
     * callback method to be invoked when the list or grid has been scrolled. this will be
     * called after the scroll has completed
     * @param view the view whose scroll state is being reported
     * @param firstvisibleitem the index of the first visible cell (ignore if
     *    visibleitemcount == 0)
     * @param visibleitemcount the number of visible cells
     * @param totalitemcount the number of items in the list adaptor
     */
    public void onscroll(abslistview view, int firstvisibleitem, int visibleitemcount,
        int totalitemcount);
  }

2.1 onscrollsatechanged方法

onscrollsatechanged根据scrollstate来决定其回调的次数,它有三种模式:

• onscrolllistener.scroll_state_idle:滚动停止时的状态

• onscrolllistener.scroll_state_stouch_scroll:触摸正在滚动,手指还没离开界面时的状态

• onscrolllistener.scroll_state_fling:用户在用力滑动后,listview由于惯性将继续滑动时的状态

当用户没有用力滑动时,onscrollsatechanged方法只会回调2次,否则回调三次,我们在使用时通常会以设置flag标志,来区分不同的滑动状态,从而进行相应的处理

2.2 onscroll方法

在listview滚动时会一直被回调,它通过里面有三个参数来显示当前listview的滚动状态

• firstvisibleitem:当前能看见的第一个item的id(从0开始)

• visibleitemcount:当前可见的item总数

• totalitemcount:列表中适配器总数量,也就是整个listview中item总数

注意:当前可见的item总数,包括屏幕中没有显示完整的item,如显示一半的item也会算在可见范围内

通过这三个参数,我么可以实现很多事件判断,如:

(1)判断当前是否滑动到最后一行

当前视图中第一个item的id加上当前屏幕中可见item的总数如果等于listview中所有item总数时,就表示移动到了最后一行

if (firstvisibleitem + visibleitemcount == totalitemcount && totalitemcount > 0) {
// 滚动到最后一行了
}

(2)判断滑动的方向

通过oldvisibleitem 记录上一次firstvisibleitem的位置,再与滑动后的firstvisibleitem进行比较,就可得知滑动的方向

if (firstvisibleitem > oldvisibleitem) {
// 向上滑动
}
if (firstvisibleitem < oldvisibleitem) {
// 向下滑动
}
oldvisibleitem = firstvisibleitem;

listview也为我们提供了一些封装好了的方法,来获取item的位置信息

// 获取当前可见区域内第一个item的id
mlistview.getfirstvisibleposition();

// 获取当前可见区域内最后一个item的id
mlistview.getlastvisibleposition();

以上这篇android listview监听滑动事件的方法(详解)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。