Android ListView inside SwiperFreshLayout inside Drawer(布局):不锁定滚动方向

Android ListView inside SwiperFreshLayout inside Drawer(布局):不锁定滚动方向,android,listview,Android,Listview,ListView将其滚动方向锁定在滚动开始的方向。这在这种配置下非常有效: DrawerLayout ListView 当我向上/向下滑动时,列表会滚动。当我向左滚动时,抽屉关闭:完美。当我开始向下滑动然后改变方向时,初始方向(水平/垂直)被锁定 但是,如果我将列表包装成如下布局: DrawerLayout SwipeRefreshLayout ListView 。。然后,滚动/滑动方向的锁定不再起作用。当我向上/向下滑动,然后向左/向右滑动一点时,列表会滚动

ListView将其滚动方向锁定在滚动开始的方向。这在这种配置下非常有效:

DrawerLayout
    ListView
当我向上/向下滑动时,列表会滚动。当我向左滚动时,抽屉关闭:完美。当我开始向下滑动然后改变方向时,初始方向(水平/垂直)被锁定

但是,如果我将列表包装成如下布局:

DrawerLayout
    SwipeRefreshLayout
        ListView
。。然后,滚动/滑动方向的锁定不再起作用。当我向上/向下滑动,然后向左/向右滑动一点时,列表会滚动,抽屉也会移动。后者不是我想要的


关于如何使用SwipperFreshLayout恢复前一种行为的任何建议?

您可以尝试的是,在手势检测器的帮助下,找到滑动是水平还是垂直。如果是垂直的,则将触摸事件发送给列表视图,否则发送给抽屉布局。

我也有同样的问题,但使用RecyclerView而不是ListView。最简单的修复方法是扩展SwiperFreshLayout,当检测到向下滚动运动时,告诉父(抽屉)布局不要截获事件(例如滑动抽屉)


我使用的是支持库版本“23.2.1”,我没有这个问题。

我以前从未使用过它,但会尝试一下。谢谢
import android.content.Context;
import android.support.v4.widget.SwipeRefreshLayout;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.ViewConfiguration;

public class DrawerSwipeRefreshLayout extends SwipeRefreshLayout {

    private int touchSlop;
    private float initialDownY;

    public DrawerSwipeRefreshLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
        touchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                initialDownY = event.getY();
                break;

            case MotionEvent.ACTION_MOVE:
                final float eventY = event.getY();
                float yDiff = Math.abs(eventY - initialDownY);

                if (yDiff > touchSlop) {
                    getParent().requestDisallowInterceptTouchEvent(true);
                }
        }

        return super.onInterceptTouchEvent(event);
    }

}