最近開發遇到需要布局底部有個清單需要滑動,原本打算在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"