ListView嵌入ViewPager

在ListView的Item中嵌入ViewPager,在滑动屏幕时会产生冲突。 重写ViewPager的Touch分发事件,根据滑动位置判断touch动作是由自己处理还是传递给父控件。

注:以下代码转自孤云

/** 
 * @Description: 嵌入ListView的ViewPager
 * 重写dispatchTouchEvent判断ViewPager滑动还是ListView滑动
 */
public class MyViewPager extends ViewPager {
	/*
	//使用此方会拦截所有ViewPager的touch事件,使父控件ListView无法滑动
    public MyViewPager(Context context) {
        super(context);
    }
    
    public MyViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        getParent().requestDisallowInterceptTouchEvent(true);//这句话的作用 告诉父view,我的单击事件我自行处理,不要阻碍我。
	    return super.dispatchTouchEvent(ev);
	}
	*/
    

	private float xDown;// 记录手指按下时的横坐标。
	private float xMove;// 记录手指移动时的横坐标。
	private float yDown;// 记录手指按下时的纵坐标。
	private float yMove;// 记录手指移动时的纵坐标。
	private boolean viewpagersroll = false;// 当前是否是viewpager滑动

	public MyViewPager(Context context) {
		super(context);
	}

	public MyViewPager(Context context, AttributeSet attrs) {
		super(context, attrs);
	}

	@Override
	public boolean dispatchTouchEvent(MotionEvent ev) {
		if (ev.getAction() == MotionEvent.ACTION_DOWN) {
			// 记录按下时的位置
			xDown = ev.getRawX();
			yDown = ev.getRawY();
		} else if (ev.getAction() == MotionEvent.ACTION_MOVE) {
			xMove = ev.getRawX();
			yMove = ev.getRawY();

			if (viewpagersroll) {
				// viewpager自己处理滑动效果
				getParent().requestDisallowInterceptTouchEvent(true);
				return super.dispatchTouchEvent(ev);
			}

			// 这里的动作判断是Viewpager滑动,ListView不滑动
			if (Math.abs(yMove - yDown) < 20 && Math.abs(xMove - xDown) > 20) {
				viewpagersroll = true;
			} else {
				// 由父容器listview来处理滑动效果
				return false;
			}
		} else if (ev.getAction() == MotionEvent.ACTION_UP) {
			viewpagersroll = false;
		}
		return super.dispatchTouchEvent(ev);
	}
}
Table of Contents