如需轉載,請標明原文出處: https://juejin.im/post/5d0c7693f265da1b6a349c5f ,謝謝。
背景
最近專案首頁是ViewPager+Fragment實現左右滑動切換,並且其中有輪播圖,目前輪播圖是用RecyclerView來實現。
本來是一切正常,後來增加一個需求,需要輪播圖可以無限滑動。
首先就想到在RecyclerView.Adapter#getItemCount()方法返回Integer.MAX_VALUE,然後再稍微修改下List.get(int index)取值邏輯,最後頁面開啟讓RecyclerView滾動到中間來實現。
問題
在RecyclerView.Adapter#getItemCount()返回真正的List.size()數量的時候一切正常,RecyclerView 、ViewPager兩個相安無事,非常和諧。但是當RecyclerView.Adapter#getItemCount()返回Integer.MAX_VALUE,就會導致RecyclerView左右滑動和ViewPager的左右滑動衝突。
解決
目前測試出兩個解決方案:
1. 更改返回值
RecyclerView.Adapter#getItemCount()不要返回Integer.MAX_VALUE,改為返回3000000(這個數值可自行測試得出)或者其他數值。
測試機有限,目前測試返回390W+的時候都可以正常滑動,一旦返回大於等於400W就會開始衝突。
具體原因未知。
這樣可以不需要自定義RecyclerView。
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);
}
}
複製程式碼