Listview 嵌套 Viewpager 滑动冲突的解决

做项目时遇到ListView嵌套ViewPager的情况,直接使用V4包中的ViewPager导致ViewPager不能滑动的情况,

通过上网查资料这明显是ListView和ViewPager的滑动冲突导致的。通过上网查资料,需要重写ViewPager解决这个问题。但是解决办法并没有那么完美。

通过重写ViewPager的dispatchTouchEvent方法,让其返回true,getParent().requestDisallowInterceptTouchEvent(true);让ViewPager消费自身的事件。此方法取得一定的效果,ViewPager可以横向滑动了,但是当在ViewPager区域上下滑动的时候ListView 并不能下拉刷新,虽然暂时解决了滑动问题,但并不是完美的。

于是我又对重写的ViewPager做了一定的优化。代码如下:

import android.content.Context;

import android.support.v4.view.ViewPager;

import android.util.AttributeSet;

import android.view.MotionEvent;


public class MyViewPager extends ViewPager {

MyViewPager viewPager;


public MyViewPager(Context context) {

super(context);

// TODO Auto-generated constructor stub

}


public MyViewPager(Context context, AttributeSet attrs) {

super(context, attrs);

}


private float xDown;// 记录手指按下时的横坐标。

private float xMove;// 记录手指移动时的横坐标。

private float yDown;// 记录手指按下时的纵坐标。

private float yMove;// 记录手指移动时的纵坐标。

private boolean viewPagerScrolling = false;

private boolean fatherScrolling = false;


@Override

public boolean dispatchTouchEvent(MotionEvent ev) {

// TODO Auto-generated method stub


switch (ev.getAction() & MotionEvent.ACTION_MASK) {

case MotionEvent.ACTION_DOWN:


xDown = ev.getX();

yDown = ev.getY();


break;

case MotionEvent.ACTION_MOVE:

xMove = ev.getX();

float yMove = ev.getY();

if (Math.abs(yMove - yDown) < Math.abs(xMove - xDown)

&& Math.abs(xMove - xDown) > 2) {

getParent().requestDisallowInterceptTouchEvent(true);


} else {

getParent().requestDisallowInterceptTouchEvent(false);


}


break;

case MotionEvent.ACTION_UP:


this.getParent().requestDisallowInterceptTouchEvent(false);

break;

}

return super.dispatchTouchEvent(ev);

}

}

这个是判断手指落下和抬起时移动的X,Y 的坐标,如果X方向上移动较大且大于2的情况下就认定为横向滑动,由ViewPager自行消费。否则由ListView消费。 通过对移动坐标的判断,实现了ViewPager既能左右滑动,又能实现ListView的下拉刷新。
  这个改动暂时解决了我的问题,也许解决办法不是完美的,也希望对大家有帮助,或者有更好解决办法的可以告诉我哦。。
  转载请注明出处。


你可能感兴趣的:(Android)