RecyclerView 中的 MotionLayout 状态错误

Posted

技术标签:

【中文标题】RecyclerView 中的 MotionLayout 状态错误【英文标题】:Wrong MotionLayout state in RecyclerView 【发布时间】:2022-01-10 05:58:48 【问题描述】:

我有包含 40 个项目的 RecyclerView。 Item 是一个 CardView,里面有 MotionLayout:

<androidx.cardview.widget.CardView 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:cardView="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/card_view"
    android:layout_
    android:layout_
    android:layout_margin="2dp"
    cardView:cardCornerRadius="4dp"
    cardView:cardElevation="2dp">

<androidx.constraintlayout.motion.widget.MotionLayout
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/motion_layout"
    android:layout_
    android:layout_
    app:layoutDescription="@xml/elements_catalog_item_scene">

    <ImageView
        android:id="@+id/element_icon"
        android:layout_
        android:layout_
        android:layout_margin="10dp"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        tools:src="@drawable/ic_ca" />

    <TextView
        android:id="@+id/element_name"
        android:layout_
        android:layout_
        android:layout_marginStart="10dp"
        android:layout_marginTop="12dp"
        app:layout_constraintStart_toEndOf="@+id/element_icon"
        app:layout_constraintTop_toTopOf="@+id/element_icon"
        tools:text="element name" />

    <TextView
        android:id="@+id/element_description"
        android:layout_
        android:layout_
        android:padding="10dp"
        android:visibility="gone"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@id/element_icon"
        tools:text="element description"/>

</androidx.constraintlayout.motion.widget.MotionLayout>
</androidx.cardview.widget.CardView>

当用户点击任何项目时,它会展开,用户可以在元素名称下方看到元素描述。当用户点击展开的项目时,它会折叠。 问题是 - 然后第一项被展开,如果用户向下滚动列表,第 15 项也被展开。如果用户折叠第 15 个项目,第一个项目也将被折叠。它适用于所有项目 2 -> 16 -> 31。等 我知道,RecyclerView 重用视图, 我想我可以将状态存储在我的项目列表中并将其作为有效负载提供给 RecyclerView ViewHolder,但是我应该如何在 ViewHolder.bind() 中设置 MotionLayout 的正确状态?或者我可以只使用 RecyclerView 设置吗?

【问题讨论】:

【参考方案1】:

在 ViewHolder.bind() 中。 必须设置 MotionLayout 的 stat,因为 RecyclerView 正在回收布局。

【讨论】:

以上是关于RecyclerView 中的 MotionLayout 状态错误的主要内容,如果未能解决你的问题,请参考以下文章

在recyclerview的嵌套recyclerview中的嵌套列表中添加项目

RecyclerView | 处理 RecyclerView 中的点击事件

Kotlin - Recyclerview 分页中的问题

AndroidStudio-添加RecyclerView包 AndroidStudio添加v7包中的RecyclerView

如何从其他recyclerview接收recyclerview中的数据?

更新片段中的 RecyclerView