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

发布时间 - 2026-01-11 00:08:30    点击率:

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监听滑动事件的方法(详解)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。


# listview滑动监听事件  # Android ListView里控件添加监听方法的实例详解  # android动态布局之动态加入TextView和ListView的方法  # Android ListView添加头布局和脚布局实例详解  # Android中ListView Item布局优化技巧  # Android实现的ListView分组布局改进示例  # Android ListView自动显示隐藏布局的实现方法  # Android自定义listview布局实现上拉加载下拉刷新功能  # Android App界面的ListView布局实战演练  # Android Listview中显示不同的视图布局详解及实例代码  # Android开发实现ListView部分布局监听的方法  # 回调  # 第一个  # 中有  # 多点  # 给大家  # 按下  # 好了  # 还没  # 也会  # 我们可以  # 只会  # 希望能  # 可在  # 三种  # 相关信息  # 就可  # 可以实现  # 另外一个  # 也为  # 这篇 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel怎么实现前端Toast弹窗提示_Laravel Session闪存数据Flash传递给前端【方法】  如何利用DOS批处理实现定时关机操作详解  jQuery validate插件功能与用法详解  Laravel如何实现用户注册和登录?(Auth脚手架指南)  Firefox Developer Edition开发者版本入口  Win11怎么设置默认图片查看器_Windows11照片应用关联设置  香港服务器部署网站为何提示未备案?  HTML5空格和nbsp有啥关系_nbsp的作用及使用场景【说明】  如何在万网主机上快速搭建网站?  Laravel怎么生成URL_Laravel路由命名与URL生成函数详解  Laravel如何自定义错误页面(404, 500)?(代码示例)  北京网站制作公司哪家好一点,北京租房网站有哪些?  如何在 Pandas 中基于一列条件计算另一列的分组均值  教你用AI将一段旋律扩展成一首完整的曲子  百度输入法全感官ai怎么关 百度输入法全感官皮肤关闭  深圳网站制作平台,深圳市做网站好的公司有哪些?  详解CentOS6.5 安装 MySQL5.1.71的方法  JavaScript如何实现音频处理_Web Audio API如何工作?  齐河建站公司:营销型网站建设与SEO优化双核驱动策略  如何彻底删除建站之星生成的Banner?  Laravel Seeder怎么填充数据_Laravel数据库填充器的使用方法与技巧  javascript中的数组方法有哪些_如何利用数组方法简化数据处理  JS弹性运动实现方法分析  Laravel怎么使用Blade模板引擎_Laravel模板继承与Component组件复用【手册】  网站页面设计需要考虑到这些问题  php嵌入式断网后怎么恢复_php检测网络重连并恢复硬件控制【操作】  如何在企业微信快速生成手机电脑官网?  美食网站链接制作教程视频,哪个教做美食的网站比较专业点?  Laravel的.env文件有什么用_Laravel环境变量配置与管理详解  香港服务器租用每月最低只需15元?  Laravel如何操作JSON类型的数据库字段?(Eloquent示例)  Python文件流缓冲机制_IO性能解析【教程】  php增删改查怎么学_零基础入门php数据库操作必知基础【教程】  如何快速查询域名建站关键信息?  Win11关机界面怎么改_Win11自定义关机画面设置【工具】  详解Nginx + Tomcat 反向代理 负载均衡 集群 部署指南  Laravel怎么为数据库表字段添加索引以优化查询  uc浏览器二维码扫描入口_uc浏览器扫码功能使用地址  Claude怎样写结构化提示词_Claude结构化提示词写法【教程】  Laravel Seeder填充数据教程_Laravel模型工厂Factory使用  Win11应用商店下载慢怎么办 Win11更改DNS提速下载【修复】  谷歌浏览器如何更改浏览器主题 Google Chrome主题设置教程  Laravel如何实现多表关联模型定义_Laravel多对多关系及中间表数据存取【方法】  大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?  高防服务器租用首荐平台,企业级优惠套餐快速部署  Laravel如何安装Breeze扩展包_Laravel用户注册登录功能快速实现【流程】  如何使用 Go 正则表达式精准提取括号内首个纯字母标识符(忽略数字与嵌套)  如何快速搭建高效简练网站?  如何构建满足综合性能需求的优质建站方案?  Laravel Blade组件怎么用_Laravel可复用视图组件的创建与使用