天天看點

解決ScrollView嵌套RecyclerView出現item顯示不全的問題

最近開發遇到需要布局底部有個清單需要滑動,原本打算在RecyclerView中添加HeadView,後來覺得不太合适,就采用了ScrollView嵌套RecyclerView方式來實作,在Android6.0以下的手機都可以使用,當時也沒太在意覺得能實作就好了

ScrollView嵌套RecyclerView滑動沖突解決:

禁止RecyclerView滑動,在RecyclerView的LinearLayoutManager

LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this) {
            @Override
            public boolean canScrollVertically() {
                return false;
            }
        };
linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
recyclerView.setLayoutManager(linearLayoutManager);
           

但是換了個7.0的手機發現RecyclerView的Item顯示不全,滑動也顯示不全,于是去網上看了解決方案:

方案一

嵌套一層RelativeLayout添加屬性 android:descendantFocusability="blocksDescendants"

首先該屬性android:descendantFocusability的含義是:當一個view擷取焦點時,定義ViewGroup和其子控件兩者之間的關系。

它一共有3個屬性值,它們分别是:

beforeDescendants:viewGroup會優先子類控件而擷取焦點

afterDescendants:viewGroup隻有當子類控件不需要擷取焦點的時候才去擷取焦點

blocksDescendants:viewGroup會覆寫子類控件而直接擷取焦點

方案二

首先在xml布局中将你的ScrollView替換成android.support.v4.widget.NestedScrollView,并在java代碼中設定recyclerView.setNestedScrollingEnabled(false);

備注其他問題:

問題1、在6.0以上版本中ScrollView嵌套RecyclerView顯示了,但是顯示不完全

解決:這其實是在版本更新以後的一個小bug,隻需要在RecyclerView的外層再嵌套一個LinearLayout或者RelativeLayout即可,這樣RecyclerView就可以顯示完整,不用像一些部落格說的那樣進行高度計算和OnMeasured()重寫。

問題2、ScrollView嵌套RecyclerView後滑動很緩慢,不流暢,沒有慣性

解決:對于RecyclerView加入兩行代碼:

    recyclerView.setHasFixedSize(true);

    recyclerView.setNestedScrollingEnabled(false);

    即可使其滑動流暢,有慣性。

問題3、ScrollView嵌套RecyclerView後,頁面不會從頁面頂部開始顯示,會從RecyclerView第一個Item的位置開始顯示

解決:在Xml頁面頂部位置的布局控件中加入兩句代碼:

    android:focusable="true"

    android:focusableInTouchMode="true" 

繼續閱讀