1. 程式人生 > >ScrollView巢狀RecyclerView 衝突問題的幾個解決方法

ScrollView巢狀RecyclerView 衝突問題的幾個解決方法

方法一:將RecyclerView的可滑動屬性設定為false,這裡重寫他的LayoutManager的canScrollVertically()方法即可(我用的豎直佈局)

LinearLayoutManager manager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false){
    @Override
public boolean canScrollVertically() {
        return false;
}
};
recyclerView.setLayoutManager(manager);

方法二:重寫外層的ScrollView,5.1以上系統會預設把滑動事件傳遞給內層的RecyclerView,我們直接在外層強行攔截就好了

/**
 * 遮蔽滑動事件
 *
 * 用於在RecyclerView外層巢狀ScrollView
 * 直接在ScrollView層將豎直的滑動事件攔截下來,避免與內層的RecyclerView滑動衝突
 *
 */
public class MyScrollview extends ScrollView {

    private int downY;
    private int mTouchSlop;
    public MyScrollview
(Context context) { this(context,null); } public MyScrollview(Context context, AttributeSet attrs) { this(context,attrs,0); } public MyScrollview(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); mTouchSlop = ViewConfiguration.get
(context).getScaledTouchSlop(); } @Override public boolean onInterceptTouchEvent(MotionEvent e) { int action = e.getAction(); switch (action) { case MotionEvent.ACTION_DOWN: downY = (int) e.getRawY(); break; case MotionEvent.ACTION_MOVE: int moveY = (int) e.getRawY(); if (Math.abs(moveY - downY) > mTouchSlop) { return true; } } return super.onInterceptTouchEvent(e); } }

額,有時候你會發現你的外層的ScrollView起始位置不是在最頂部,很可能是內部的RecyclerView之類的預設獲取了焦點,只要

recyclerView.setFocusable(false);
就可以了