天天看点

解决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" 

继续阅读