问题:
ViewPage作为ListView的头部一起使用时,会出现滑动冲突.导致ViewPage的滑动事件失灵.
解决方法:
1.重写ListView 拦截ListView的左右滑动事件 代码如下:
public class MyListView extends ListView {
// 滑动距离及坐标
private float xDistance, yDistance, xLast, yLast;
public MyListView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public MyListView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MyListView(Context context) {
super(context);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
xDistance = yDistance = 0f;
xLast = ev.getX();
yLast = ev.getY();
break;
case MotionEvent.ACTION_MOVE:
final float curX = ev.getX();
final float curY = ev.getY();
xDistance += Math.abs(curX - xLast);
yDistance += Math.abs(curY - yLast);
xLast = curX;
yLast = curY;
//如果x坐标滑动距离大于y坐标滑动距离 就拦截
if (xDistance > yDistance) {
return false; //表示向下传递事件
}
}
return super.onInterceptTouchEvent(ev);
}
}
说明:在onInterceptTouchEvent这个方法里拦截。如果x坐标滑动距离大于y坐标滑动距离就表示是ViewPager的滑动,所以滑动处理交给ViewPager的OnTouchEvent来处理,ListView不处理。(代码里返回return false) 。反之 return super.onInterceptTouchEvent(ev); 表示交给当前view(也就是ListView的触摸事件处理)。
2.重写ViewPage 代码如下:
package com.example.bz_viewpager;
import android.content.Context;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.ViewGroup;
/**
* viewpage 和listview 相互冲突 将父view 传递到viewpage 里面
*
* 使用父类的方法 parent.requestDisallowInterceptTouchEvent(true);
*
* 当 requestDisallowInterceptTouchEvent 如果为true的时候 表示:父view 不拦截子view的touch 事件
*
* 这个方法只是改变flag
*
* @author baozi
*
*/
public class DecoratorViewPager extends ViewPager {
private ViewGroup parent;
public DecoratorViewPager(Context context) {
super(context);
// TODO Auto-generated constructor stub
}
public DecoratorViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
public void setNestedpParent(ViewGroup parent) {
this.parent = parent;
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
if (parent != null) {
parent.requestDisallowInterceptTouchEvent(true);
}
return super.dispatchTouchEvent(ev);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent arg0) {
if (parent != null) {
parent.requestDisallowInterceptTouchEvent(true);
}
return super.onInterceptTouchEvent(arg0);
}
@Override
public boolean onTouchEvent(MotionEvent arg0) {
if (parent != null) {
parent.requestDisallowInterceptTouchEvent(true);
}
return super.onTouchEvent(arg0);
}
}
说明:要在代码里调用: vp.setNestedpParent((ViewGroup)vp.getParent()); 方法 将 viewpager 的父view传递到viewpager里面
viewgroup 当中有 一个 requestDisallowInterceptTouchEvent方法.这个方法只改变flag 当 view.requestDisallowInterceptTouchEvent 参数为true的时候 ,view 不会拦截其子控件的 触摸事件