ViewPager嵌套HorizontalListView滑动冲突

最近在项目中碰到一个bug,ViewPager中嵌套HorizontalListView,滑动HorizontalListView时没有达到预期的效果(HorizontalListView滑动),反而是ViewPager滑动了。这是一个极差的用户体验。
因为这是一个触控事件,自然而然地想到用事件机制来处理。简单说,就是消费事件。那么,在哪个位置把这个事件消费掉。于是有了两个思路:
一、在页面里进行事件消费;
二、在HorizontalListView控件里进行消费。
有了思路,说干就干。
第一个思路尝试:我通过判断手指按下的位置是不是在HorizontalListView的范围里进行事件处理。
那么就得先获取HorizontalListView范围吧。
    float x1,x2,y1,y2;
    int[] location=new int[2];
    HorizontalListView.getLocationOnScreen(location);
    x1=location[0];
    x2=x1+HorizontalListView.getWidth();
    y1=location[1];
    y2=y1+HorizontalListView.getHeight();
运行之后发现获取不到HorizontalListView的坐标值,于是就放弃了这个思路。
第二个思路尝试:在HorizontalListView控件里进行消费。在HorizontalListView类中声明一个viewpager变量,重写其中的三个方法:
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
    if(viewPager!=null){
        viewPager.requestDisallowInterceptTouchEvent(true);
    }
    return mGesture.onTouchEvent(ev);
}

@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
    if(viewPager!=null){
        viewPager.requestDisallowInterceptTouchEvent(true);
    }
    return mGesture.onTouchEvent(ev);
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    if(viewPager!=null){
        viewPager.requestDisallowInterceptTouchEvent(true);
    }
    return mGesture.onTouchEvent(event);
}

然后在HorizontalListView类中声明一个方法进行绑定ViewPager:

 public void setViewPager(ViewPager viewPager){
        this.viewPager=viewPager;
    }

运行代码,成功的达到了预期效果。

你可能感兴趣的:(Android开发,事件传递机制,滑动冲突)