ListView与ViewPage的冲突

问题:

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 不会拦截其子控件的 触摸事件

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值