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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/380436.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

获得jmp esp地址

对于大部分想要利用缓冲区溢出的人来说&#xff0c;jmp esp就再熟悉不过了&#xff0c;我最近发现网上将如何如何利用它的人太多太多&#xff0c;可是就是没人告诉在shellcode 中到底jmp esp的地址在哪&#xff0c;有些直接给除了它的地址可是由于jmp esp随系统的不同地址也不同…

TreeView无限极分类绑定(从数据库读取数据源)

TreeView这个控件其实我本来不怎么会用到&#xff0c;今天有一个项目要用到&#xff0c;而且是无限极的分类数据绑定&#xff0c;于是就根据自己以前写过的代码别写出了这个无限极分类的例子&#xff0c;呵呵希望能够对大家有所帮助&#xff0c;本人尽量把注释写的详细一些把&a…

为何把牛奶倒入大海

汤姆是生活在米国乌有城城郊的一位奶牛场主&#xff0c;不知何故&#xff0c;方圆数百里&#xff0c;只有这一家奶牛场。汤姆的奶牛场有2000头奶牛&#xff0c;每月产奶2000吨&#xff0c;这牛奶供应给乌有城的市民和周边的农民。牛奶售价是每吨500美元&#xff0c;每吨牛奶的生…

软件工程 软件设计 步骤_好的软件设计特点 软件工程

软件工程 软件设计 步骤For good quality software to be produced, the software design must also be of good quality. Now, the matter of concern is how the quality of good software design is measured? This is done by observing certain factors in software desi…

android游戏黑屏,第五人格游戏进不去黑屏解决办法

小编今天给各位玩家朋友们带来的是第五人格游戏进不去黑屏解决办法&#xff0c;很多的玩家朋友们在第五人格更新后都出现了黑屏、游戏无法进入等情况&#xff0c;这应该怎么办呢&#xff1f;小编把解决方法给大家整理在了下方&#xff0c;感兴趣的小伙伴们快来跟小编一起往下看…

交换输出

描述 输入n(n<100)个数&#xff0c;找出其中最小的数&#xff0c;将它与最前面的数交换后输出这些数。(如果这个第一个数就是最小的数&#xff0c;则保持原样输出&#xff0c;如果最小的数有相同的按照前面的交换) 输入 输入数据有多组&#xff0c;每组占一行&#xff0c…

线性表----顺序表

线性表的定义 线性表是具有相同数据类型的n个数据元素的有限序列&#xff0c; 逻辑特性 除第一个元素外&#xff0c;每个元素只有一个前驱&#xff0c;除最后一个元素外&#xff0c;每个元素都有一个后继 物理结构 线性表的存储结构有顺序存储结构和链式存储结构&#xff…

python各种语言间时间的转化

一 基本知识millisecond 毫秒microsecond 微秒 nanosecond 纳秒1秒1000毫秒 1毫秒1000微秒 1微秒1000纳秒二 perlperl中可以使用time或localtime来获得时间&#xff0c;time返回从1970年1月1日0点的秒数&#xff0c;localtime返回当前时间的字符串表示&#xff0c;或者年月日等…

javascript小技巧

事件源对象 event.srcElement.tagName event.srcElement.type 捕获释放 event.srcElement.setCapture(); event.srcElement.releaseCapture(); 事件按键 event.keyCode event.shiftKey event.altKey event.ctrlKey 事件返回值 event.returnValue 鼠标位置 event.x event.…

树、二叉树、二叉搜索树_检查二叉树是否为BST(二叉搜索树)

树、二叉树、二叉搜索树Description: 描述&#xff1a; This article describes how to check whether a given tree is BST or not? This problem came in coding round of Microsoft. 本文介绍如何检查给定的树是否是BST &#xff1f; 这个问题来自微软的编码回合。 Probl…

兄弟郊游问题

描述 兄弟俩骑车郊游&#xff0c;弟弟先出发&#xff0c;每分钟X米&#xff0c;M分钟后&#xff0c;哥哥带一条狗出发。以每分钟Y米的速度去追弟弟&#xff0c;而狗则以每分钟Z米的速度向弟弟跑去&#xff0c;追上弟弟后又立即返回&#xff0c;直到哥哥追上弟弟时&#xff0c;…

栈溢出利用-----jmp esp

通过jmp esp利用栈溢出&#xff0c;首先我们要找出jmp esp 的地址&#xff0c;因为系统不同&#xff0c;通用jmp esp的地址可能不同&#xff0c;下面的代码是找出jmp esp的地址的&#xff1a; #include<windows.h> #include<iostream.h>#include<tchar.h> i…

android 队列上传图片,话说android端七牛图片上传

七牛图片上传业务流程如下图(这是官方的图)&#xff1a;由上图可知&#xff0c;要想实现图片上传&#xff0c;是要三端进行交互的(我刚刚开始以为只要七牛服务器跟客户端交互就行)接下来步骤如下&#xff1a;1、首先肯定是要有一个七牛的账号&#xff0c;并创建一个空间2、客户…

在.NET中得到计算机硬件信息的一些功能

得到显示器分辨率 Dim X As Short System.Windows.Forms.Screen.PrimaryScreen.Bounds.WidthDim Y As Short System.Windows.Forms.Screen.PrimaryScreen.Bounds.HeightMsgBox("您的显示器分辨率是&#xff1a;" & X & " X " & Y) 得到特殊文…

GridView 利用AspNetPager 分页时的自动编号

GridView 利用AspNetPager 分页时的自动编号 <%# (this.WillisPager1.CurrentPageIndex-1) * this.WillisPager1.PageSize Container.DataItemIndex 1%> 转载于:https://www.cnblogs.com/waren168/archive/2011/07/18/2109305.html

bst 删除节点_C ++程序查找具有N个节点的BST数量(加泰罗尼亚编号)

bst 删除节点Problem statement: C program to find number of binary search trees with n nodes. 问题陈述&#xff1a; C 程序查找具有n个节点的二进制搜索树的数量。 Input format: single integer n 输入格式&#xff1a;单整数n Constraints: 0<n<15 约束&#x…

线性表----链式表

定义 线性表的链式存储又称单链表&#xff0c;它是指通过任意的存储单元来存储线性表的数据。注意此时的数据在物理地址上不在连续&#xff0c;内存是动态分配的&#xff0c;而且数据是存放在结点中&#xff0c;结点组成链表&#xff0c;每个节点分为数据域和指针域&#xff0…

奋斗的小蜗牛

描述 传说中能站在金字塔顶的只有两种动物&#xff0c;一种是鹰&#xff0c;一种是蜗牛。一只小蜗牛听了这个传说后&#xff0c;大受鼓舞&#xff0c;立志要爬上金字塔。为了实现自己的梦想&#xff0c;蜗牛找到了老鹰,老鹰告诉它金字塔高H米&#xff0c;小蜗牛知道一个白天自…

android intent实验,Android开发课程实验报告③ intent的使用

Android开发课程实验报告author&#xff1a;065实验四&#xff1a;intent实验报告目录实验目的初学移动应用公开发中的Android开发&#xff0c;实验四的主要内容为intent的使用&#xff0c;通过这一次实验&#xff0c;掌握基本的intent使用方法。具体实验分析实验第一步&#x…

[职场生存]细节和感觉[一]

zhengyun 200701 刚刚进入软件行业的时候&#xff0c;我特别喜欢问那些我眼中的强人一个问题&#xff1a;“怎么让自己比别人更快更强?”那时候真的是感觉“一万年太久&#xff0c;只争朝夕”。 下面挑出其中我认为很重要的两点和大家分享。这两点适用于技术人员乃至于不同行业…