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可复用视图组件的创建与使用

