SwipeRefreshLayout下拉刷新与SwipeMenuListView侧滑滑动冲突问题解决

    最近在项目开发中需要使用到SwipeRefreshLayout的下拉刷新以及SwipeMenuListView的侧滑删除功能,在两者结合使用时,发现在侧滑时,很容易导致SwipeRefreshLayout的刷新图标也会跟着显示出来,容易造成列表卡顿,很明显,SwipeMenuListView侧滑操作与SwipeRefreshLayout下拉刷新操作产生了滑动冲突问题,如下demo例图所示:



    解决方法也很简单,可以根据不同的条件来对事件进行拦截,下面是我采用外部拦截法对SwipeRefreshLayout的onInterceptTouchEventfangf进行重写,主要根据用户滑动的垂直距离差dy和水平距离差dx来决定对事件的拦截与否,同时在代码中也进行了相应的备注,希望对大家有参考意义:

import android.content.Context;
import android.support.v4.widget.SwipeRefreshLayout;
import android.util.AttributeSet;
import android.view.MotionEvent;

public class CustomSwipeRefreshLayout extends SwipeRefreshLayout {
    private int mDownX = 0;
    private int mDownY = 0;

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

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

    //重写onInterceptTouchEvent方法对事件进行拦截
    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        super.onInterceptTouchEvent(ev);
        boolean intercepted = false;
        switch (ev.getAction()) {
            case MotionEvent.ACTION_DOWN:
                intercepted = false;
                //记录下点击的位置
                mDownX = (int) ev.getX();
                mDownY = (int) ev.getY();
                break;
            case MotionEvent.ACTION_MOVE:
                int currX = (int) ev.getX();
                int currY = (int) ev.getY();
                int dx = currX - mDownX;
                int dy = currY - mDownY;
                //拦截条件:
                //1.下拉
                //2.垂直距离差大于水平距离差
                if (dy > 0 && (dy > Math.abs(dx))) {
                    //此时还要根据父类的处理结果来决定事件拦不拦截
                    //因为当ListView已经往下滑动过后,不应该对事件进行拦截,否则ListView不能往上滑动
                    intercepted = super.onInterceptTouchEvent(ev);
                } else {
                    intercepted = false;
                }
                break;
            case MotionEvent.ACTION_UP:
                intercepted = false;
                break;
            default:
                break;
        }
        return intercepted;
    }
}


猜你喜欢

转载自blog.csdn.net/okg0111/article/details/79794813
今日推荐