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

android listview ontouchlistener,Android ListView监听滑动事件的方法(详解)相关推荐

  1. Android屏幕触摸监听,Android在Fragment中实现监听触摸事件

    本文给大家介绍的是监听Fragment的触摸事件实现.如果大家有更好的机制,可以留言交流,下面来看看详细的介绍: 大家都知道,我们的activity中有onTouchEvent方法,可以用来实现触摸事 ...

  2. 开发笔记- iOS监听某些事件的方法简单梳理

    ----Make by -LJW 转载请注明出处--- 通知(NSNotificationCenter\NSNotification) 任何对象之间都可以传递消息 使用范围(多对多) 1个对象可以发通 ...

  3. android 清空数组缓存,Android数据持久化之读写SD卡中内容的方法详解

    本文实例讲述了Android数据持久化之读写SD卡中内容的方法.分享给大家供大家参考,具体如下: 前面文章里讲的那三个方法:openFileOutput.openFileInput虽然都能通过流对象O ...

  4. centos oracle 修改监听服务名_Oracle架构详解

    01 前言 学习任何一门科学,都要从他的背景和宏观体系开始,那么数据库也不例外. 体系结构为什么重要,因为体系结构是对一个系统的框架描述,只有从宏观上掌握它的物理组成.文件组成和各种文件组成,在实际工 ...

  5. Android scrollview监听滑动状态

    首先说一下 NestedScrollView 的滑动事件的监听, 如果使用 nestedScrollView.setOnScrollChangeListener(new View.OnScrollCh ...

  6. Android 关于在Activity中监听ListView

    Android 开发时,最常用的控件之一就是ListView了,而使用ListView的同时,必然需要对它设置监听器,常用的监听器有这么几个: 1. OnItemClickListener // 监听 ...

  7. Android RecyclerView 监听滑动

    今天,简单讲讲Android 如何监听滑动. 不废话了,主要是需要做一个功能,实现RecyclerView滑动时,让一个标题栏固定显示在顶部. 基本知识: 列表的滚动一般分为两种: 手指按下 -> ...

  8. Android初级,实现网易云音乐歌曲列表界面效果,播放界面效果,ListView,ViewPager方法详解

    初学Android初级,第一篇博客文章,如有错误,还望批评指正! 本文主要内容以网易云音乐歌曲列表界面效果代码,播放音乐界面效果代码为主,并将ListView和ViewPager作为实现界面滑动功能的 ...

  9. android 监听物理返回键,Android应用开发之react-native 监听Android物理返回键

    本文将带你了解Android应用开发之react-native 监听Android物理返回键,希望本文对大家学Android有所帮助. 1. componentWillMount(){         ...

最新文章

  1. R语言nchar函数统计字符串中字符个数实战
  2. 说说你对 HTML 语义化的理解?
  3. mysql中使用BETWEEN  AND
  4. lost connection to MySQL server at waiting for initial communication packet,system error:o
  5. elk 聚合日志_使用ELK堆栈进行日志聚合
  6. python会不会出4_无极4网人生苦短,Python会不会被取代?国外网友
  7. rlwrap解决sqlplus上下键和backspace键找历史命令
  8. 应用程序无法正常启动(0xc000007b)错误的解决
  9. Bootstrap 3.0正式版发布!
  10. python 面向对象的封装_Python面向对象封装操作案例详解
  11. 一本通————1244 和为给定数
  12. 峥果智能连接不到服务器,峥果浴霸 ESP8285版本 固件
  13. GAMIT处理GLONASS数据
  14. 维刻柠檬鲜果冰怎么样?
  15. 2021年中国理财产品行业之新发行银行理财产品概览,中国银行发行2359只,位居榜首「图」
  16. python安装目录插件
  17. 点计算机无桌面图标,电脑桌面没有任何图标并且点鼠标右键没反应 - 卡饭网
  18. hive打patch流程说明
  19. 最新全国姓名报告出炉!
  20. html5微信语音转文字,文字转换语音软件:我有个朋友不会识字 怎么能把微信上别人发给他的文字转换成语音...

热门文章

  1. CSS盒子模型之详解
  2. CSS--选择符大全(常用css选择符)
  3. [转]我是如何走进黑客世界的?
  4. configparser logging
  5. mysql--------四种索引类型
  6. 提示错误:“应为“providerInvariantName”参数的非空字符串。”
  7. DevExpress GridControl 后台设置列
  8. Javascript -- In
  9. 简单的Delegate(委托)例子
  10. response对象设置返回状态_postman 设置全局变量