动画布局防止RecyclerView更新

12
我最近开始使用MotionLayout来滚动一些顶部栏,但似乎存在一个问题,导致RecyclerView无法显示更新后的数据。我目前正在使用ConstraintLayout的2.0.0-alpha3版本。在视图中,我有工具栏和2个作为过滤器的选项卡,假设是filterX和filterY,它们会传递一些Rx内容,基本上只是基于type过滤项目列表,这不重要,因为数据已正确过滤,线程也正确,每次将数据传递给Adapter,但当我将MotionLayout向上或向下滚动时,有时更改不会反映在RecyclerView中,它们会在我稍微滚动一下甚至触摸后重新加载,在标准的ConstraitLayout情况下不会发生这种情况。请问是否有人遇到过这种情况并知道任何解决方案?
编辑:配有MotionLayout的布局:
<androidx.constraintlayout.motion.widget.MotionLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layoutDescription="@xml/scene_month">

    <androidx.appcompat.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:navigationIcon="@drawable/ic_back"/>

    <TextView
        android:id="@+id/title"
        style="@style/ActivityTitle"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@id/toolbar" />

    <com.example.FilterView
        android:id='@+id/filter_view'
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@android:color/white"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@id/title"/>

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recycler"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:clipToPadding="false"
        android:paddingBottom="16dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@id/filter_view" />

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

运动场景

<?xml version="1.0" encoding="utf-8"?>
<MotionScene xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <Transition
        app:constraintSetEnd="@id/end"
        app:constraintSetStart="@id/start">
        <OnSwipe
            app:dragDirection="dragUp"
            app:touchAnchorId="@id/recycler"
            app:touchAnchorSide="top" />
    </Transition>

    <ConstraintSet android:id="@+id/start">
        <Constraint android:id="@id/title"
            android:text="@string/title"
            android:layout_width="match_parent"
            android:layout_height="48dp"
            android:gravity="center_vertical"
            android:textSize="28sp"
            android:textColor="@color/dark_gray"
            android:fontFamily="@font/rubik_medium"
            android:layout_marginStart="16dp"
            android:layout_marginEnd="16dp"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@id/toolbar">
            <CustomAttribute
                app:attributeName="textSize"
                app:customFloatValue="28"/>
        </Constraint>
    </ConstraintSet>

    <ConstraintSet android:id="@+id/end">
        <Constraint android:id="@id/title"
            android:text="@string/title"
            android:layout_width="match_parent"
            android:layout_height="?actionBarSize"
            android:gravity="center_vertical"
            android:minHeight="?actionBarSize"
            android:textSize="28sp"
            android:textColor="@color/dark_gray"
            android:fontFamily="@font/rubik_regular"
            android:layout_marginStart="72dp"
            android:layout_marginEnd="16dp"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent">
            <CustomAttribute
                app:attributeName="textSize"
                app:customFloatValue="20"/>
        </Constraint>
    </ConstraintSet>

</MotionScene>

1
用代码进行了编辑。 - user2141889
1
我在constraintlayout:2.0.0-alpha4中遇到了相同的问题。当我执行notifyDatasetChanged时,数据没有得到更新。只有在滚动时才会更新。 - Javier Delgado
1
看起来 alpha5 修复了所有问题,但是我刚刚进行了一个快速测试,所以可能会有一些失败的情况。 - user2141889
1
@JithishPN 更新Motion Layout到最新版本,问题已解决。 - user2141889
@user2141889 我正在使用constraintlayout:2.0.0-beta1版本,但是在滚动方面仍然存在一些问题。 - Jithish P N
显示剩余4条评论
5个回答

5

通过遵循这里讨论的可能解决方案:https://issuetracker.google.com/issues/130386093

将标签motion:layoutDuringTransition="honorRequest"添加到过渡中可以解决此问题。

例如:

<Transition
    android:id="@+id/myTransition"
    motion:constraintSetEnd="@+id/end"
    motion:constraintSetStart="@+id/start"
    motion:layoutDuringTransition="honorRequest"
    motion:motionInterpolator="linear">
    <OnSwipe
        motion:dragDirection="dragUp"
        motion:onTouchUp="stop"
        motion:touchAnchorId="@+id/swipeRefreshLayout"
        motion:touchAnchorSide="top" />

除此之外,也可以尝试升级到较新的版本。在我的情况下,我目前使用的是

implementation 'androidx.constraintlayout:constraintlayout:2.0.0-beta08'
implementation 'androidx.recyclerview:recyclerview:1.2.0-alpha05'

注意:layoutDuringTransition 标签仅适用于 beta04 版本及以上的约束布局。

motion:layoutDuringTransition="honorRequest" 终于生效了。尝试更新版本并没有帮助,已经尝试了 ConstraintLayout(2.1.0-alpha2)、RecyclerView(1.2.0-beta01)和 ViewPager2(1.1.0-alpha01)的最新非稳定版本。 - Myroslav

3

在我的情况下,recyclerView.smoothScrollBy(0,1) 有帮助。 - frangulyan

1

由于某些原因,RecyclerView.scrollBy(0, 0) 对我无效。当 RecyclerView 更新时,我使用以下方法将整个 MotionLayout 滚动到顶部。

motionLayoutView.transitionToStart()


我发现实际上你需要滚动它,也许用动画效果,所以在我的情况下,每次平滑滚动1个像素有所帮助 - recyclerView.smoothScrollBy(0,1)。虽然不美观,但是有效。 - frangulyan

0

这些解决方法都对我没用。我放弃了修复它们,转而修复其他UI错误。我有几个视图上下滑动和隐藏/显示。

我在我的代码中使用了TransitionManager.beginDelayedTransition(...),但它不在Runnable内部。将其包装在view.post{}中,问题就消失了:

view.post{
    TransitionManager.beginDelayedTransition()
}

这可能看起来不相关,但我建议检查你的代码以查看问题是否出现在其他地方。像其他人一样,我认为这是由于MotionLayout引起的,因为当我将其与ConstraintLayout交换时,它正常工作。


0

升级到新版本

  implementation 'androidx.constraintlayout:constraintlayout:2.0.0-beta7'

他们在发布说明中列出的问题已经得到解决

  • MotionLayout中的嵌套滚动视图问题
  • MotionLayout中的转换监听器问题
  • MotionLayout中的内存泄漏问题
  • RecyclerView性能问题
  • 组可见性问题
  • 填充问题

https://androidstudio.googleblog.com/2020/06/constraintlayout-200-beta-7.html


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接