ScrollView巢狀RecyclerView 衝突問題的幾個解決方法
阿新 • • 發佈:2019-02-16
方法一:將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);就可以了