Android RecyclerView 23.2.x height=0dp会导致对所有项目调用onBind,并且scrollToPosition不工作

Android RecyclerView 23.2.x height=0dp会导致对所有项目调用onBind,并且scrollToPosition不工作,android,android-linearlayout,android-recyclerview,Android,Android Linearlayout,Android Recyclerview,更新 我刚刚将支持库更新为23.3.0,这个问题似乎不再发生了。我想这是23.2.X版本中的一个bug。这不是我第一次花几个小时研究一个奇怪的问题,后来发现它是安卓SDK的一个bug。 结束更新 在下面的代码中,我将layout\u height=“0dp”和layout\u weight=“1”设置到回收器视图,使其填充线性布局的剩余空间。在我看来,由于设置了布局权重,所以不需要布局高度,但忽略该属性被认为是错误的,我在堆栈溢出的其他问题中发现的示例建议使用“0dp” 奇怪的是,如果我设置la

更新 我刚刚将支持库更新为
23.3.0
,这个问题似乎不再发生了。我想这是
23.2.X
版本中的一个bug。这不是我第一次花几个小时研究一个奇怪的问题,后来发现它是安卓SDK的一个bug。 结束更新

在下面的代码中,我将
layout\u height=“0dp”
layout\u weight=“1”
设置到回收器视图,使其填充线性布局的剩余空间。在我看来,由于设置了布局权重,所以不需要布局高度,但忽略该属性被认为是错误的,我在堆栈溢出的其他问题中发现的示例建议使用“0dp”

奇怪的是,如果我设置layout_height=“0dp”,所有项目都会同时调用onBindViewHolder()。也就是说,调试输出如下

onBindViewHolder(0)
...
onBindViewHolder(99)
onBindViewHolder(0)
...
onBindViewHolder(8)
如果我设置layout_height=“1dp”,则在滚动之前,仅会为前几个项目调用onBindViewHolder()。也就是说,调试输出如下

onBindViewHolder(0)
...
onBindViewHolder(99)
onBindViewHolder(0)
...
onBindViewHolder(8)
这不会发生在RecyclerView版本23.1.1上,但会发生在版本23.2.0和23.2.1上(例如,
com.android.support:RecyclerView-v7:23.2.1
),并且还会使程序滚动不起作用。为什么会这样?在这种情况下我应该使用“1dp”吗

以下是完整的源代码

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
>

<FrameLayout
    android:layout_width="0dp"
    android:layout_height="match_parent"
    android:layout_weight="1"
    android:background="@android:color/holo_green_dark"
    />

<View
    android:layout_width="1dp"
    android:layout_height="match_parent"
    android:background="#ff111111"/>

<LinearLayout
    android:layout_width="0dp"
    android:layout_height="match_parent"
    android:layout_weight="3"
    android:orientation="vertical">

    <FrameLayout
        android:background="@android:color/holo_orange_light"
        android:layout_width="match_parent"
        android:layout_height="50dp">

    </FrameLayout>

    <android.support.v7.widget.RecyclerView
        android:id="@+id/mylist"
        android:scrollbars="vertical"
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:layout_weight="1"
        >

    </android.support.v7.widget.RecyclerView>

    <FrameLayout
        android:background="@android:color/holo_blue_bright"
        android:layout_width="match_parent"
        android:layout_height="50dp">
    </FrameLayout>
</LinearLayout>


不确定这是否是您想要的。如果高度为100,则为了将其分布在两个组件中。前40%,后60%。应该是这样。layout_height=“0dp”和layout_weight=“0.40”用于第一个组件,layout_height=“0dp”和layout_weight=“0.60”用于第二个组件查看24.2.1版本中相同错误的公认答案。RecyclerView heightSpec为0,因此[android.support.v7.widget.LinearLayoutManager#resolveIsInfinite]为true。对于布局权重为1的recyclerview,我必须将布局宽度从“0dp”更改为“匹配父项”。在horiznontal LinearLayout中,否则我们将为每个项目调用onBind。