Макет движения предотвращает обновление в 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>

Пожалуйста, покажите нам свой макет и MotionScene, чтобы мы могли вам помочь.

jossiwolf 12.03.2019 14:41

Сделал правку с кодом

user2141889 12.03.2019 14:51

У меня такая же проблема в constraintlayout:2.0.0-alpha4. Когда я это делаю notifyDatasetChanged данные не обновляются. Он обновляется, когда я выполняю прокрутку

Javier Delgado 19.04.2019 00:40

Правда обновил и стало еще хуже, раньше работало на первую загрузку, теперь бьет даже первая загрузка данных, пока не выполняется прокрутка

user2141889 19.04.2019 19:49

Похоже, alpha5 исправили все проблемы, однако прямо сейчас я провел быстрый тест, поэтому могут быть некоторые ситуации, в которых он не работает.

user2141889 30.04.2019 10:57

У меня была такая же проблема в альфа-версии 4. Обновился до бета-версии 1, и у меня тоже проблема исчезла.

Bernas 13.05.2019 21:05

@user2141889 user2141889 любое решение?

Jithish P N 21.08.2019 09:05

@JithishPN обновил макет движения до последней версии, проблема решена

user2141889 21.08.2019 11:05

@ user2141889 limitedlayout:2.0.0-beta1 Я использую этот. Все еще некоторые проблемы с прокруткой

Jithish P N 21.08.2019 14:49
12
9
3 489
5

Ответы 5

RecyclerView.scrollBy(0, 0) как временное решение.

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

В моем случае recyclerView.smoothScrollBy(0,1) помогло.

frangulyan 03.04.2020 01:09

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

motionLayoutView.transitionToStart()

Выяснил, что прокручивать его действительно нужно и возможно в анимированном виде, так что в моем случае помогла плавная прокрутка на 1 пиксель — recyclerView.smoothScrollBy(0,1). Некрасиво, но работает.

frangulyan 03.04.2020 01:13

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

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

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

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

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

Следуя возможному решению, как обсуждалось здесь: 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 22.02.2021 21:05

Ни один из этих обходных путей не работал для меня. Я отказался от их исправления и исправлял другие ошибки пользовательского интерфейса, которые у меня были. У меня есть несколько представлений, скользящих вверх/вниз и скрывающих/показывающих.

Я использовал TransitionManager.beginDelayedTransition(...) в своем коде, и он не был внутри Runnable. После такой упаковки в view.post{} проблема исчезла:

view.post{
    TransitionManager.beginDelayedTransition()
}

Это может показаться неуместным, но я предлагаю проверить ваш код, чтобы увидеть, не находится ли проблема где-то еще. Как и все остальные, я думал, что это вызвано MotionLayout, потому что, когда я поменял его местами с ConstraintLayout, он работал нормально.

Другие вопросы по теме