Макет движения предотвращает обновление на recyclerview

Я начал использовать макет движения для прокрутки верхней панели и, похоже, существует проблема, которая не позволяет отображать обновленные данные в представлении ресайклера. В настоящее время я использую 2.0.0-alpha3 из ConstraintLayout. В представлении у меня есть панель инструментов и 2 вкладки, которые действуют как фильтр, скажем, filterX и filterY, которые передают некоторый материал rx, который в основном просто фильтрует список элементов на основе type, это не важно, потому что данные фильтруются правильно, поток правильный, данные передается адаптеру каждый раз, но когда я прокручиваю макет движения вверх или вниз, время от времени изменения не отражаются в представлении ресайклера, они перезагружаются после того, как я прокручиваю его немного или даже касаюсь, этого не происходит в случай стандартного ConstraitLayout. Кто-нибудь испытал это и знает какое-либо решение?

Изменить: макет с макетом движения:

<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>

person user2141889    schedule 12.03.2019    source источник
comment
Пожалуйста, покажите нам свой макет и MotionScene, чтобы мы могли вам помочь.   -  person jossiwolf    schedule 12.03.2019
comment
Внес правку в код   -  person user2141889    schedule 12.03.2019
comment
У меня такая же проблема в constraintlayout:2.0.0-alpha4. Когда я делаю notifyDatasetChanged, данные не обновляются. Он обновляется, когда я прокручиваю   -  person Javier Delgado    schedule 19.04.2019
comment
Правда обновил и стало даже хуже, раньше работало на первую загрузку, теперь даже первая загрузка данных выполняется до тех пор, пока не будет выполнена прокрутка   -  person user2141889    schedule 19.04.2019
comment
Похоже, alpha5 исправил все проблемы, однако я сделал только быстрый тест прямо сейчас, поэтому могут быть некоторые ситуации, в которых он не работает   -  person user2141889    schedule 30.04.2019
comment
У меня была такая же проблема в альфа-версии 4. Обновился до бета-версии 1, и эта проблема исчезла и для меня.   -  person Bernas    schedule 13.05.2019
comment
@ user2141889 какое-нибудь решение?   -  person Jithish P N    schedule 21.08.2019
comment
@JithishPN обновите макет движения до последней версии, проблема решена   -  person user2141889    schedule 21.08.2019
comment
@ user2141889 constraintlayout: 2.0.0-beta1 Я использую этот. По-прежнему возникают проблемы с прокруткой   -  person Jithish P N    schedule 21.08.2019


Ответы (4)


RecyclerView.scrollBy(0, 0) в качестве временного решения.

Ссылка на этот трекер проблем Google

person Samnang CHEA    schedule 26.06.2019
comment
В моем случае помогло recyclerView.smoothScrollBy(0,1). - person frangulyan; 03.04.2020

Следуя возможному решению, описанному здесь: 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 и выше.

person Wai Choong Wong    schedule 06.08.2020
comment
motion:layoutDuringTransition="honorRequest" заставил его работать. Однако обновление версий не помогло, попробовал установить последние нестабильные версии ConstraintLayout (2.1.0-alpha2), RecyclerView (1.2.0-beta01) и ViewPager2 (1.1.0-alpha01). - person Myroslav Kolodii; 22.02.2021
comment
пожалуйста, отметьте это как принятый ответ - person Nitin Prakash; 01.06.2021

По какой-то причине RecyclerView.scrollBy(0, 0) у меня не работал. Я прокручиваю весь макет движения вверх, используя метод ниже, когда есть обновления для recyclerView.

motionLayoutView.transitionToStart()

person Isanaka    schedule 05.03.2020
comment
Я обнаружил, что вам действительно нужно прокручивать его и, возможно, в анимированной форме, поэтому в моем случае помогла плавная прокрутка на 1 пиксель - recyclerView.smoothScrollBy(0,1). Некрасиво, но работает. - person frangulyan; 03.04.2020

обновить до более новой версии

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

поскольку они исправили эту проблему, как указано в примечаниях к выпуску

  • Проблемы с вложенным просмотром прокрутки в MotionLayout
  • Проблемы с прослушивателем перехода с MotionLayout
  • Утечка памяти в MotionLayout
  • Производительность RecyclerView
  • Видимость группы
  • Проблемы с заполнением

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

person Mahmoud Mabrok    schedule 07.07.2020