1. 程式人生 > >Android6.0 ScrollView與RecyclerView滑動衝突的問題

Android6.0 ScrollView與RecyclerView滑動衝突的問題

前記:我有個這樣的需求,在一個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);

這樣,倆個問題就都解決了!