Android:SwipeRefreshLayout和ViewPager滑动冲突的原因和正确的解决方式

BUG修复

2016.01.21 用几部真机测试,发现有些手机,手指没有滑动,move也一直执行。这回导致我们的判断出现一些问题。现在已经修复,加入了TouchSlop判断。

2017.6.16 修改文章中的一些错误
##一、前言
急着解决问题的直接看博文的最后面吧,或者点这里跳转过去,正确的解决方式就在那。

虽然SwipeRefreshLayout出来已经很久了,但是知道今天我才第一次使用。
然后发现两个问题:

  1. SwipeRefreshLayout会吃掉ViewPager的滑动事件。
  2. SwipeRefreshLayout需要套在ScrollView和ListView上的时候才表现的比较友好,在其他ViewGroup上有点问题,不知道为什么,到时候去看下源码。(这问题已经被google修复)

今天我只说第一个问题:
很明显如果是往左下或右下滑动的时候,事件就会被SwipeRefreshLayout吃掉。但是平移滑动或者往右上左上滑动就没问题。
这里写图片描述

二、目前网上流传的解决方式

我网上找解决方法的时候,发现无非都是两种方式。
1、监听ViewPager的OnTouch事件,滑动的时候禁用swipeRefreshLayout

mViewPager.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {

        switch (event.getAction()) {
            case MotionEvent.ACTION_MOVE:
                mSwipeRefreshLayout.setEnabled(false);
                break;
            case MotionEvent.ACTION_UP:
            case MotionEvent.ACTION_CANCEL:
                mSwipeRefreshLayout.setEnabled(true);
                break;
        }
        return false;
    }
})

2、继承ViewPager,请求父控件不要拦截ViewPager事件

public class CustomViewPager extends ViewPager {

    public CustomViewPager(Context ctx, AttributeSet attrs) {
        super(ctx, attrs);
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        boolean in = super.onInterceptTouchEvent(ev);
        if (in) {
            getParent().requestDisallowInterceptTouchEvent(true);
            this.requestDisallowInterceptTouchEvent(true);
        }
        return false;
    }
}

这两种方法都会导致一个问题, 在ViewPager无法刷新。
就像这样:
<

评论 47
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值