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. java之集合框架使用细节及常用方法

    集合类的由来:   对象用于封装特有数据,对象多了需要存储,如果对象的个数不确定.  就使用集合容器进行存储. 集合特点: 1,用于存储对象的容器. 2,集合的长度是可变的. 3,集合中不可以存储基本 ...

  2. ichartjs 使用BUG,assign_scale:true 解决

    今天纯属灌水,好久没灌水的. 最近使用了flotr2 和 ichartjs进行canvas图标的开发,都不能满足需求. 没办法,先将就用用吧.然后,既然其他大神推荐使用ichartjs,为了统一,我也 ...

  3. div、ul、li等无法居中问题,text-align无效 margin auto无效

    很简单.如果是div,直接把div换成: <table align="center">        <tr>            <td> ...

  4. 添加MySql Metat Database 信息

    有时候我们想看看 一个数据库上面 某种元素(比如表名)的所有信息,在Mysql上 我们可以通过引入information_schema 的方式,就可以非常方便的查看到. 添加步骤 Edit->P ...

  5. 【c++类的构造函数具体解释 】

    一.构造函数是干什么的 class Dog { public:          // 类Dog的构造函数          // 特点:以类名作为函数名,无返回类型          Dog()   ...

  6. MVC无刷新分页

    MVC无刷新分页(即局部刷新,带搜索,页数选择,排序功能)   我查看了很多网站,大部分评论分页都是局部刷新的,可大部分电商商品展示分页都是有刷新页面的,于是我便做了一个商品展示无刷新分页的例子.接下 ...

  7. 在SQL Server 2008中调用.net,dll

    原文:在SQL Server 2008中调用.net,dll T-SQL的在执行普通的查询的时候是很高效的,但是在执行循环,判断这样的语句的时候效率就不那么的高了.这时可以借助CLR了,我们可以在SQ ...

  8. C#放缩、截取、合并图片并生成高质量新图的类

    原文:C#放缩.截取.合并图片并生成高质量新图的类 using System;using System.Drawing;using System.Drawing.Imaging;using Syste ...

  9. ASP.NET Identity登录原理 - Claims-based认证和OWIN

    MVC5 - ASP.NET Identity登录原理 - Claims-based认证和OWIN 在Membership系列的最后一篇引入了ASP.NET Identity,看到大家对它还是挺感兴趣 ...

  10. Effective C++(19) 设计class犹如设计type

    问题聚焦:     这一节不涉及代码,但是我们需要明确的一点是,思想比代码要重要得多.     设计优秀的classes是一项艰巨的工作,就像设计好的types一样.     我们应该带着和“语言设计 ...