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. PHP 以POST方式提交XML、获取XML,最后解析XML

    以POST方式提交XML // Do a POST $data="<?xml version='1.0' encoding='UTF-8'?> <TypeRsp> & ...

  2. [强烈推荐]ORACLE PL/SQL编程详解之七:程序包的创建与应用(聪明在于学习,天才在于积累!)

    原文:[强烈推荐]ORACLE PL/SQL编程详解之七:程序包的创建与应用(聪明在于学习,天才在于积累!) [强烈推荐]ORACLE PL/SQL编程详解之七: 程序包的创建与应用(聪明在于学习,天 ...

  3. Python 3.3 try catch所有的错误Error,不包括Exception。关键在于 sys.exc_info()

    import os; import sys; #---------------------------------------------- def main( ) : try : a = 1 / 0 ...

  4. 用一条SQL语句取出第 m 条到第 n 条记录的方法

    原文:用一条SQL语句取出第 m 条到第 n 条记录的方法   --从Table 表中取出第 m 条到第 n 条的记录:(Not In 版本)       *    FROM Table     id ...

  5. Oracle执行计划——Oracle 如何启用执行计划

    AUTOTRACE是一项SQL*Plus功能,自动跟踪为SQL语句生成一个执行计划并且提供与该语句的处理有关的统计.SQL*Plus AUTOTRACE可以用来替代SQL Trace使用,AUTOTR ...

  6. [译]Java 设计模式之原型

    (文章翻译自Java Design Pattern: Prototype) 原型模式用于当当非常相似的对象频繁被需要的时候.原型模式克隆了对象并且设置变化的特征.这种方式会消耗更少的资源.考虑下为什么 ...

  7. 探秘IntelliJ IDEA 13测试版新功能——调试器显示本地变量

    IntelliJ IDEA在业界被公认为最好的Java开发平台之一,JetBrains公司将在12月正式发布IntelliJ IDEA 13版本. 现在,小编将和大家一起探秘密IntelliJ IDE ...

  8. vue实现ajax滚动下拉加载,同时具有loading效果

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  9. jQuery中开发插件的两种方式

    jQuery中开发插件的两种方式(附Demo) 做web开发的基本上都会用到jQuery,jQuery插件开发两种方式:一种是类扩展的方式开发插件,jQuery添加新的全局函数(jQuery的全局函数 ...

  10. 喜大本\\ u0026普,微软的开源

    词汇表--喜大本\\ u0026普:爱过.有趣的游戏,庆祝.奔走相告.简而言之<reload=1">微软宣布.NET开发环境开源>是个好消息. 前言及历史回想 就我个人来说 ...