RecyclerView 、ViewPager 左右滑動衝突

轉載請標明出處:juejin.im/post/5d0c76… ,謝謝。bash

背景

最近項目首頁是ViewPager+Fragment實現左右滑動切換,而且其中有輪播圖,目前輪播圖是用RecyclerView來實現。
原本是一切正常,後來增長一個需求,須要輪播圖能夠無限滑動。
首先就想到在RecyclerView.Adapter#getItemCount()方法返回Integer.MAX_VALUE,而後在稍微修改下List.get(int index)取值邏輯,最後頁面打開讓RecyclerView滾動到中間來實現。ide

問題

在RecyclerView.Adapter#getItemCount()返回真正的List.size()數量的時候一切正常,RecyclerView 、ViewPager兩個相安無事,很是和諧。可是當RecyclerView.Adapter#getItemCount()返回Integer.MAX_VALUE,就會致使RecyclerView左右滑動和ViewPager的左右滑動衝突。post

解決

目前測試出兩個解決方案:測試

1. 更改返回值

RecyclerView.Adapter#getItemCount()不要返回Integer.MAX_VALUE,改成返回3000000(這個數值可自行測試得出)或者其餘數值。
測試機有限,目前測試返回390W+的時候均可以正常滑動,一旦返回大於等於400W就會開始衝突。
具體緣由未知。
這樣能夠不須要自定義RecyclerViewui

2. 自定義RecyclerView

public class SlidingConflictRecyclerView extends RecyclerView {

    public SlidingConflictRecyclerView(@NonNull Context context) {
        super(context);
    }

    public SlidingConflictRecyclerView(@NonNull Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    public SlidingConflictRecyclerView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent event) {
        boolean canScrollHorizontally = canScrollHorizontally(-1) || canScrollHorizontally(1);
        boolean canScrollVertically = canScrollVertically(-1) || canScrollVertically(1);
        if (canScrollHorizontally || canScrollVertically) {
            ViewParent parent = getParent();
            if (parent != null) {
                parent.requestDisallowInterceptTouchEvent(true);
            }
        }
        return super.dispatchTouchEvent(event);
    }

}
複製代碼
相關文章
相關標籤/搜索