最近开发遇到需要布局底部有个列表需要滑动,原本打算在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"