[android studio]Android listview的滑动冲突解决方法

时间:2021-06-29  来源:.Net开发  阅读:

Android listview的滑动冲突解决方法

在Android开发的过程中,有时候会遇到子控件和父控件都要滑动的情况,尤其是当子控件为listview的时候。就比如在一个ScrollView里有一个listview,这种情况较常见,就会出现这种滑动冲突的情况。这种情况也比较常见,有时候就是这样,没法,但是,了解事件分发的我们知道应该怎么处理这样的事情

有两点需要注意:

一般来说,view的onTouchEvent返回true,即消耗点击事件,viewgroup的onInterceptTouchEvent返回false,即不拦截点击事件,这一点从android源码中可以看出来。但是listview的父类AbsListView重写了onInterceptTouchEvent,返回了true,注意这里不是一定返回true,但是我觉得这一点可以先忽略。

onTouchEvent和onInterceptTouchEvent的调用顺序。点击事件从父控件向子控件传递,如果父控件不拦截,则交由子控件拦截,如果父控件拦截了,则交由父控件的onTouchEvent处理,如果最终处理点击事件的控件的onTouchEvent返回了false,则将会直接调用其父控件的onTouchEvent,如此向上类推

其实解决方法也很简单:重写父控件的onInterceptTouchEvent函数,在move的时候根据需要返回true,比如左右滑动返回true,其他情况均返回false。这样,当左右滑动的时候,由于onInterceptTouchEvent返回了true,父控件就能处理,其他情况,事件将传递到listview中,listview自身可以处理上下滑动。

 

 代码如下

@Override

publicbooleanonInterceptTouchEvent(MotionEvent ev) 

{

  Log.d(TAG,"onInterceptTouchEvent-slop:"+mTouchSlop);

  

  finalintaction = ev.getAction();

  if((action == MotionEvent.ACTION_MOVE) && (mTouchState != TOUCH_STATE_REST))

  {

    returntrue;

  }

  

  finalfloatx = ev.getX();

  finalfloaty = ev.getY();

  

  switch(action)

  {

  caseMotionEvent.ACTION_MOVE:

    finalintxDiff = (int)Math.abs(mLastMotionX-x);

    if(xDiff>mTouchSlop)

    {

      mTouchState = TOUCH_STATE_SCROLLING;

    }

    break;

  

  caseMotionEvent.ACTION_DOWN:

    mLastMotionX = x;

    mLastMotionY = y;

    mTouchState = mScroller.isFinished()? TOUCH_STATE_REST : TOUCH_STATE_SCROLLING;

    break;

  

  caseMotionEvent.ACTION_CANCEL:

  caseMotionEvent.ACTION_UP:

    mTouchState = TOUCH_STATE_REST;

    break;

  }

  

  returnmTouchState != TOUCH_STATE_REST;

}

 

[android studio]Android listview的滑动冲突解决方法

http://m.bbyears.com/asp/126650.html

推荐访问:android学习路线
相关阅读 猜你喜欢
本类排行 本类最新