android6.0以上CoordinatorLayout+AppBarLayout+NestedScrollView的坑:recyclerView只显示一行

(第一次写博客有点小紧张啊)

最近做打卡界面时用了AS自带的主题:ScrollActivity。ScrollActivity使用CoordinatorLayout+AppBarLayout+NestedScrollView的组合(官方的MD设计真的很舒服)。当我在android5.1真机上调试时一点毛病都没有,但当我用android8.1真机测试时,就出现了bug,recyclerView只能显示一行,6.1也是一样,但错误日志不一样。具体的问题就是点击添加item的按键后,界面上始终只显示一行,根本不显示剩下的item。

8.1的错误日志:

09-02 13:25:21.910 32556-32556/com.example.roy.recyclerviewdemo E/SchedPolicy: set_timerslack_ns write failed: Operation not permitted

(应该是由这个bug引起的这个错误,只是为了做个参考,还是布局问题)

废话不多说,解决方法是:

NestedScrollView布局中不可以直接使用一个recyclerView(仅在该组合的复杂布局中发现有此bug),它们的中间层级中还要嵌套一个布局(亲测ConstraintLayout可用,如下)。再次修改博客时,已经用了LinearLayout,此场景下只是需要在recyclerView外嵌套一个viewgroup,所以线性布局更高效,约束布局在复杂布局中更适合。

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    tools:context=".MainActivity"
    tools:showIn="@layout/activity_main">
<android.support.constraint.ConstraintLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <com.example.roy.recyclerviewdemo.EmptyRecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="@dimen/item_content_margin"
        android:nestedScrollingEnabled="false"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"/>
</android.support.constraint.ConstraintLayout>
</android.support.v4.widget.NestedScrollView>

修改前后界面如下:

                                      

接下来是废话环节:

在对每个error甚至部分warn使用了面向搜索引擎改bug法无果之后,我开始一个个排查错误(很多博客也给了我灵感)。

当我点击按钮后,Logcat中会显示recyclerView中已添加数据(插入数据到数据库,从数据库获取数据显示),但界面上不显示;

当我不使用ScrollActivity主题的布局时(activity中仅用NestedScrollView内嵌套一个recyclerView),再用原来代码发现recyclerView显示正常。

当我用了浑身解数还未解决这个bug时,我选择放弃。不能用好看的MD设计就不用吧。接下来,当我绕过这个坑之后,我在自学和自己试着做项目时,发现了不少这种设计的activity,我就想他们能实现,肯定还是我的解决方向错了。其实一开始看博客时,网上相关的答案基本上都是用下面这俩个方法来解决recyclerView只显示一行数据和滑动不顺畅问题的(尝试过N遍,确信不适不能解决我的问题)。

android:layout_height="wrap_content"
​​​​​​​android:nestedScrollingEnabled="false"

当我仔细对比我与他们的代码时,我发现类似的组合布局中的NestedScrollView中并不是只有一个recyclerView(其实我一直遵循着少嵌套少层级的布局理念),当我在中间嵌套一个布局之后,问题就解决了。。。。。。。(此时心情难以言表)

有意思的是,在改之前design里面布局是这样的:

修复了bug后就成了这样(正常listView,recyclerView应该都是这样的,之前看了N遍,根本没发现这个区别,要不是写博客,还是发现不了,嘻嘻):

就此,我的第一篇详细记录填坑的blog就写完了,望您指正。

隔了一个月又改了一下。

猜你喜欢

转载自blog.csdn.net/NULL_thing/article/details/82314292