1.自定义LayoutMannager:
public class ScrollGridViewLayoutManager extends GridLayoutManager {
private boolean isScrollEnable = true;
public ScrollGridViewLayoutManager(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
}
public ScrollGridViewLayoutManager(Context context, int spanCount) {
super(context, spanCount);
}
public ScrollGridViewLayoutManager(Context context, int spanCount, int orientation, boolean reverseLayout) {
super(context, spanCount, orientation, reverseLayout);
}
@Override
public boolean canScrollVertically() {
return isScrollEnable && super.canScrollVertically();
}
/**
* 设置 RecyclerView 是否可以垂直滑动
* @param isEnable
*/
public void setScrollEnable(boolean isEnable) {
this.isScrollEnable = isEnable;
}
}
2.重写LayoutMannager的canScrollVertically()方法:
LinearLayoutManager layoutManager = new LinearLayoutManager(context) {
@Override
public boolean canScrollVertically() {
// 直接禁止垂直滑动
return false;
}
}
3.定义一个ScrollView子类,重写其 onInterceptTouchEvent(),不向下分发滑动事件给 RecyclerView
public class SInterceptScrollView extends ScrollView {
private int downX, downY;
private int mTouchSlop;
public SInterceptScrollView (Context context) {
this(context, null);
}
public SInterceptScrollView (Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public SInterceptScrollView (Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public SInterceptScrollView (Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
int action = ev.getAction();
switch (action) {
case MotionEvent.ACTION_DOWN:
downX = (int) ev.getRawX();
downY = (int) ev.getRawY();
break;
case MotionEvent.ACTION_MOVE:
int moveY = (int) ev.getRawY();
// 判断是否滑动,若滑动就拦截事件
if (Math.abs(moveY - downY) > mTouchSlop) {
return true;
}
break;
default:
break;
}
return super.onInterceptTouchEvent(ev);
}
}