Android6.0 ScrollView與RecyclerView滑動衝突的問題
阿新 • • 發佈:2019-01-08
前記:我有個這樣的需求,在一個LinearLayout中Vertical展示倆個不同的recycleview,但是要求倆個recycleview都全部展示出來;
在Android5.0的系統中,我的做法是,只要在LinearLayout外面加一個ScrollView我的問題就解決了。在Android5.0的機器上執行,效果確實是我要的。程式碼如下:
<ScrollView
android:id="@+id/sv_search_result"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="@dimen/size_10"
android:scrollbars="none">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<com.hp.appquestion.view .CustomRecyclerView
android:id="@+id/rv_video_list"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<com.hp.appquestion.view.CustomRecyclerView
android:id="@+id/rv_exam_list"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
</ScrollView>
但這段程式碼放到Android6.0系統的機器上面跑,我發現第二個RecyclerView的內容沒有鋪開展示,第二個RecyclerView可以滑動。而且發現還有個問題,即使ScrollView中只放一個RecyclerView,全部鋪開展示,滑動起來的時候有明顯的卡頓感。
網上查了資料,說在Android6.0系統中,如果RecyclerView與RecyclerView一起使用,確實存在倆者滑動衝突的問題。滑動衝突需要自己想辦法解決。
結合網上的資料,我自己的解決辦法是。
1,先解決第一個recyclerview都能完整顯示的問題
在倆個recyclerview外面都包裹一個相對佈局RelativeLayout,一定是倆個recyclerview都要包裹。我試著只包裹下底部的一個,發現當底部的資料增多時,會出現異常。
程式碼如下:
<ScrollView
android:id="@+id/sv_search_result"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="@dimen/size_10"
android:scrollbars="none">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<com.hp.appquestion.view.CustomRecyclerView
android:id="@+id/rv_video_list"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</RelativeLayout>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<com.hp.appquestion.view.CustomRecyclerView
android:id="@+id/rv_exam_list"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</RelativeLayout>
</LinearLayout>
</ScrollView>
上面就解決了Android6.0上倆個recyclerview都能完整顯示的問題
2,解決滑動recyclerView時有卡頓的問題
原因還是滑動衝突的問題,我的解決方案是,重寫LinearLayoutManager,設定讓其不可滑動,外部滑動靠ScrollView,這樣就解決了滑動時卡頓的問題
程式碼如下:
public class ScrollLinearLayoutManager extends LinearLayoutManager {
private boolean isScrollEnabled = true;
public ScrollLinearLayoutManager(Context context) {
super(context);
}
public ScrollLinearLayoutManager(Context context, int orientation, boolean reverseLayout) {
super(context, orientation, reverseLayout);
}
public ScrollLinearLayoutManager(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
}
public void setScrollEnabled(boolean flag) {
this.isScrollEnabled = flag;
}
@Override
public boolean canScrollVertically() {
return isScrollEnabled && super.canScrollVertically();
}
}
使用:
ScrollLinearLayoutManager scrollLinearLayoutManager = new ScrollLinearLayoutManager(this);
scrollLinearLayoutManager.setScrollEnabled(false);
mRecyclerView.setLayoutManager(scrollLinearLayoutManager);
這樣,倆個問題就都解決了!