ListView在滚动开始的方向上锁定其滚动方向。这适用于此配置:
DrawerLayout
ListView
当我向上/向下滑动时,列表会滚动。当我向左滚动时,抽屉关闭:完美。当我开始向下滑动然后改变方向时,初始方向(水平/垂直)被锁定。
但是,如果我将列表包装在SwipeRefreshLayout中,如下所示:
DrawerLayout
SwipeRefreshLayout
ListView
..然后锁定滚动/滑动方向不再起作用。当我向上/向下滑动然后向左/向右滑动一下时,列表会滚动并且抽屉也会移动。后者不是我想要的。
有关如何使用SwipeRefreshLayout恢复前一行为的任何建议?
答案 0 :(得分:1)
我有同样的问题,但使用RecyclerView而不是ListView。最简单的解决方法是扩展SwipeRefreshLayout,当检测到向下滚动时,告诉父(抽屉)布局不要截取事件(例如滑动抽屉)。
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);
}
}
答案 1 :(得分:0)
在Gesture Detector的帮助下,您可以尝试找到滑动是水平还是垂直。如果它的垂直给触摸事件列表视图,否则给DrawerLayout。
答案 2 :(得分:0)
我使用支持库版本" 23.2.1",我没有遇到问题。