listview的监听事件

来源:互联网 发布:淘宝仓管的工作 编辑:程序博客网 时间:2024/05/09 01:59

Android开发时,最常用的控件之一就是ListView了,而使用ListView的同时,必然需要对它设置监听器,常用的监听器有这么几个
1.OnItemClickListener 
2.OnTouchListener
3.OnScrollListener
1监听器在点击该项目的子项时触发,2监听器在触碰到ListView时触发,3监听器在ListView滚动时触发,
下面几个例子分别表述了具体处理的办法


[java] view plain copy
  1. class ItemClickEvent implements OnItemClickListener {  
  2.   
  3.         @Override  
  4.         public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,  
  5.                 long arg3) {  
  6.             // TODO Auto-generated method stub  
  7.             // arg1.setVisibility(View.GONE);  
  8.   
  9.             // 对子项处理的办法  
  10.   
  11.       
  12.             // BtnCheck(0);  
  13.             System.out.println(arg2);  
  14.         }  
  15.   
  16.     }  
  17.   
  18.   
  19.     class ItemTouchEvent implements OnTouchListener {  
  20.   
  21.         @Override  
  22.         public boolean onTouch(View v, MotionEvent event) {  
  23.             // TODO Auto-generated method stub  
  24.             // System.out.println("触摸..");  
  25.             if (event.getAction() == MotionEvent.ACTION_MOVE) {  
  26.                 // System.out.println("MOVE");  //接触到ListView移动时  
  27.                 BtnCheck(0);  
  28.             } else if (event.getAction() == MotionEvent.ACTION_UP) {  
  29.                 // System.out.println("up");   //离开ListView时  
  30.                 BtnCheck(currentPage);  
  31.             } else if (event.getAction() == MotionEvent.ACTION_DOWN) {  
  32.                 // System.out.println("down");   //接触到ListView时  
  33.                 BtnCheck(0);  
  34.             }  
  35.   
  36.             return false;  
  37.         }  
  38.   
  39.     }  
  40.   
  41.     class LvScrollEvent implements OnScrollListener {  
  42.   
  43.         @Override  
  44.         public void onScroll(AbsListView view, int firstVisibleItem,  
  45.                 int visibleItemCount, int totalItemCount) {  
  46.             // TODO Auto-generated method stub  
  47.   
  48.         }  
  49.   
  50.         @Override  
  51.         public void onScrollStateChanged(AbsListView view, int scrollState) {  
  52.             // TODO Auto-generated method stub  
  53.             switch (scrollState) {  
  54.             case OnScrollListener.SCROLL_STATE_IDLE: //  
  55.                 BtnCheck(currentPage);  
  56.                 // mBusy = false;  
  57.                 System.out.println("停止...");  
  58.                 break;  
  59.             case OnScrollListener.SCROLL_STATE_TOUCH_SCROLL:  
  60.                 BtnCheck(0);  
  61.                 // mBusy = true;  
  62.                 System.out.println("正在滑动...");  
  63.                 break;  
  64.             case OnScrollListener.SCROLL_STATE_FLING:  
  65.                 BtnCheck(0);  
  66.                 // mBusy = true;  
  67.                 System.out.println("开始滚动...");  
  68.   
  69.                 break;  
  70.             }  
  71.         }  
  72.   
  73.     }  

以下对于listview滑动事件的整理:

ListView的滑动监听,是ListView中最重要的技巧,很多重写ListView,基本都是在滑动事件的处理上下功夫,通过判断滑动事件进行不同的逻辑处理.为了更加精确地监听滑动事件,我们通常还需要GestureDetector手势识别,VelocityTracker滑动速度的检测等辅助类来完成更好的监听,下面是ListIView的滑动事件的方法,一个是通过OnTouchListener来实现监听,另一个是使用OnScrollListener来实现监听.

-OnTouchListener

onTouchListener是View中的监听事件,通过监听ACTION_DOWN,ACTION_MORE,ACTION_UP.这三个事件发生时的坐标,就可以根据坐标判断用户滑动的方向,并在不同的事件中进行相应的逻辑处理,这种方式的使用代码如下所示.

mListView.setOnTouchListener(new View.OnTouchListener()){      @Override      public boolean onTouch(View v,MotionEvent event){              swicth(event.getAction()){                    case:MotionEvent.ACTION_DOWN:                           //触摸时操作                           break;                    case:MotionEvent.ACTION_MOVE:                           //移动时操作                           break;                    case:MotionEvent.ACTION_MOVE:                           //离开时操作                           break;                  }         }        return false;}

-OnScrollListener

OnScollListener是AbsListView中的监听事件,它封装了很多与ListView相关的信息,用起来也更加灵活.首先来看一下OnScollListener的一般使用方法,代码如下所示:

mListView.setOnScrollListener(new AbsListView.OnScrollListener() {              @Override   public void onScrollStateChanged(AbsListView       view, int scrollState) {            switch (scrollState){                    case SCROLL_STATE_IDLE:                        //滑动停止时调用                                break;                       case SCROLL_STATE_TOUCH_SCROLL:                          //正在滚动时调用                           break;                      case SCROLL_STATE_FLING:                           //手指快速滑动时,在离开ListView由于惯性滑动                     break;           }   }   @Override    public void onScroll(AbsListView view, int firstVisibleItem,                 int visibleItemCount, int totalItemCount) {            //滚动时一直调用    } });

OnScrollListener中有两个回调方法-------onScrollStateChanged()和onScroll()

onScrollStateChanged这个方法根据他的参数srrollState来决定其回调的次数,scrollState有三种模式

SCROLL_STATE_IDLE: 滚动停止时
SCROLL_STATE_TOUCH_SCROLL 正在滚动时
SCROLL_STATE_FLING 手指快速滑动时,在离开ListView由于惯性滑动

当用户没有做手指抛动的状态时,这个方法只会回调2次,否则会回调3次,差别就是手指抛动的这个状态,通常情况下,我们在这个方法中通过不同的状态来设置一些Flag,来区分不同的滑动状态,供其他方法处理.


下面这个onScroll()这个回调方法,它在ListView滚动时会一直回调,而方法中的>后三个int类型

firstVisibleItem:当前能看到的第一个Item的ID(从0开始).
visibleItemCount:当前能看到的Item的总数
totalItemCount 整个ListView的Item的总数

这里需要注意的是,当前能看见的Item数,包括没有显示完整的Item,即显示一小半的Item也包括在内.通过这几个参数,可以很方便地进行一些判断.比如判断是否滚动到最后一行,就可以使用如下代码进行判断,当前可视的另一个Item的ID加上当前可视Item的和等于Item总数的时候,即滚动到了最后一行.

if(firstVisibleItem+visibleItemCount==totalItemCount&&totalItemCount>0) {       //滚动到最后一行,在这里可以处理ListView上拉加载更多  }


文/weiyushuai(简书作者)
原文链接:http://www.jianshu.com/p/5d2c1a621604
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。



0 0
原创粉丝点击