做项目时遇到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);
}
}