Android 开发时,最常用的控件之一就是ListView了,而使用ListView的同时,必然需要对它设置监听器,常用的监听器有这么几个:
  1. OnItemClickListener // 监听器在点击该子项时触发;
  2. OnTouchListener     // 监听器在触碰到ListView时触发;
  3. OnScrollListener     // 监听器在ListView滚动时触发。

下面几个例子分别表述了具体处理的办法:

1. OnItemClickListener:

 class ItemClickEvent implements AdapterView.OnItemClickListener {

     @Override
public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
// TODO Auto-generated method stub
// parent.setVisibility(View.GONE); // 对子项处理的办法 // BtnCheck(0);
System.out.println(position);
}
}

2. OnTouchListener:

 class ItemTouchEvent implements View.OnTouchListener {

     @Override
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
// System.out.println("触摸..");
if (event.getAction() == MotionEvent.ACTION_MOVE) {
// System.out.println("MOVE"); // 触摸滑动ListView时
BtnCheck(0);
} else if (event.getAction() == MotionEvent.ACTION_UP) {
// System.out.println("up"); // 离开ListView时
BtnCheck(currentPage);
} else if (event.getAction() == MotionEvent.ACTION_DOWN) {
// System.out.println("down"); // 开始接触到ListView时
BtnCheck(0);
} return false;
} }

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

  • MotionEvent.ACTION_DOWN:开始触摸;
  • MotionEvent.ACTION_MOVE:触摸移动;
  • MotionEvent.ACTION_UP:触摸抬起;
  • MotionEvent.ACTION_OUTSIDE:触摸范围超过了UI边界;
  • MotionEvent.ACTION_CANCEL:触摸被取消时(当用户保持按下操作,并从你的控件转移到外层控件时,会触发ACTION_CANCEL);
  • MotionEvent.ACTION_POINTER_DOWN:当有另外一个触摸按下时(多点触摸);
  • MotionEvent.ACTION_POINTER_UP:当另一个触摸抬起时(多点触摸)。

3. OnScrollListener:

 class LvScrollEvent implements AbsListView.OnScrollListener {

     @Override
public void onScroll(AbsListView view, int firstVisibleItem,
                  int visibleItemCount, int totalItemCount) { // 监听滑动
// TODO Auto-generated method stub } @Override
public void onScrollStateChanged(AbsListView view, int scrollState) { // 监听滑动状态的改变
// TODO Auto-generated method stub
switch (scrollState) {
case OnScrollListener.SCROLL_STATE_IDLE: //
BtnCheck(currentPage);
// mBusy = false;
System.out.println("停止...");
break;
case OnScrollListener.SCROLL_STATE_TOUCH_SCROLL:
BtnCheck(0);
// mBusy = true;
System.out.println("正在滑动...");
break;
case OnScrollListener.SCROLL_STATE_FLING:
BtnCheck(0);
// mBusy = true;
System.out.println("开始滚动..."); break;
}
} }

3.1 OnScrollSateChanged() 方法

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

  • OnScrollListener.SCROLL_STATE_IDLE:滚动停止时的状态
  • OnScrollListener.SCROLL_STATE_STOUCH_SCROLL:触摸正在滚动,手指还没离开界面时的状态
  • OnScrollListener.SCROLL_STATE_FLING:用户在用力滑动后,ListView由于惯性将继续滑动时的状态

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

3.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 的position
mListView.getFirstVisiblePosition(); // 获取当前可见区域内最后一个item 的position
mListView.getLastVisiblePosition();

Android 关于在Activity中监听ListView的更多相关文章

  1. android activity中监听View测量完成的4种方式

    在开发中经常碰到需要在activity初始化完成后获得控件大小的情况. 但是这个操作我们不能在oncreate.onresume等生命周期方法中调用,因为我们不知道何时view才能初始化完成 为此,特 ...

  2. Android中监听ListView滑动到底部

    Android中的应用就是ListView中向下滑动加载更多的功能,不要再onScroll方法中进行判断,那样当滑动到底部的时候,触摸屏幕就会又去加载更多,效果很差,可以自行测试一下: listvie ...

  3. Android:监听ListView

    本文目录 监听ListView点击事件 监听ListView滚动事件 监听ListView点击事件 使用监听器OnItemClickListener package com.example.tests ...

  4. 在Activity,Service,Window中监听Home键和返回键的一些思考,如何把事件传递出来的做法!

    在Activity,Service,Window中监听Home键和返回键的一些思考,如何把事件传递出来的做法! 其实像按键的监听,我相信很多人都很熟练了,我肯定也不会说这些基础的东西,所以,前期,还是 ...

  5. Android项目:使用pulltorefresh开源项目扩展为下拉刷新上拉加载更多的处理方法,监听listview滚动方向

    很多android应用的下拉刷新都是使用的pulltorefresh这个开源项目,但是它的扩展性在下拉刷新同时又上拉加载更多时会有一定的局限性.查了很多地方,发现这个开源项目并不能很好的同时支持下拉刷 ...

  6. Android 监听 Android中监听系统网络连接打开或者关闭的实现代码

    本篇文章对Android中监听系统网络连接打开或者关闭的实现用实例进行了介绍.需要的朋友参考下 很简单,所以直接看代码 复制代码 代码如下: package xxx; import android.c ...

  7. Android 监听ListView、GridView滑动到底部

    // 监听listview滚到最底部 mIndexList.setOnScrollListener(new OnScrollListener() { @Override public void onS ...

  8. Fragment中监听onKey事件,没你想象的那么难。

    项目中越来越多的用到Fragment,在用Fragment取代TabHost的时候遇到了一个问题,我们都知道,TabHost的Tab为Activity实例,有OnKey事件,但是Fragment中没有 ...

  9. Android-服务中监听电源键和Home键的广播、在锁屏下仍然工作的方法

    Android-服务中监听电源键和Home键的广播  http://blog.csdn.net/u014657752/article/details/49512485 Android开发之如何监听让服 ...

随机推荐

  1. HTML页面的动画的制作及性能

    原文:HTML页面的动画的制作及性能 WEB页面的动画的制作及性能 简介 目前WEB页面做动画的方式大的分两种1.JS间隔时间不断修改元素属性值,这也是CSS3出来前常用的做法,貌似也是唯一的做法.2 ...

  2. JS链表

    链表 我们可以看到在javascript概念中的队列与栈都是一种特殊的线性表的结构,也是一种比较简单的基于数组的顺序存储结构.由于javascript的解释器针对数组都做了直接的优化,不会存在在很多编 ...

  3. 那些必须要知道的Javascript

    原文:那些必须要知道的Javascript JavaScript是前端必备,而这其中的精髓也太多太多,最近在温习的时候发现有些东西比较容易忽略,这里记录一下,一方面是希望自己在平时应用的时候能够得心应 ...

  4. Visual Studio 2010 单元测试--运行测试并查看代码覆盖率

    原文:Visual Studio 2010 单元测试--运行测试并查看代码覆盖率 运行测试并查看代码覆盖率对程序集中的代码运行测试时,可以通过收集代码覆盖率数据来查看正在测试的项目代码部分. 运行测试 ...

  5. SQLServer访问Oracle查询性能问题解决

    原文:SQLServer访问Oracle查询性能问题解决 1. 问题 系统有个模块,需要查询Oracle数据库中的数据.目前是通过建立链接服务器实现的. SQLServer访问Oracle实现 可参考 ...

  6. Android项目---TouchListener

    public static interface View.OnTouchListener android.view.View.OnTouchListener Known Indirect Subcla ...

  7. SpringMVC源码

    SpringMVC源码分析系列 说到java的mvc框架,struts2和springmvc想必大家都知道,struts2的设计基本上完全脱离了Servlet容器,而springmvc是依托着Serv ...

  8. IS_EER分析

    下面我们就来具体分析一下这段代码,看看内核中的巧妙设计思路. 要想明白IS_ERR(),首先理解要内核空间.所有的驱动程序都是运行在内核空间,内核空间虽然很大,但总是有限的,而在这有限的空间中,其最后 ...

  9. Javascript多线程引擎(十)---Web服务器

     Javascript多线程引擎(十)---Web服务器 经过一天的努力, 引擎可以支持web服务的功能了并且支持UTF-8的编码, 具有对HTTP参数的解析,状态码的配置, 响应报文的输出等. 提供 ...

  10. iOS基础 - 文本属性Attributes

    NSKernAttributeName: 调整字句 kerning 字句调整 NSFontAttributeName : [UIFont systemFontOfSize:_fontSize] 设置字 ...