Я начал использовать макет движения для прокрутки верхней панели, и похоже, что есть проблема, которая не позволяет просмотру ресайклера отображать обновленные данные. В настоящее время я использую 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>
Сделал правку с кодом
У меня такая же проблема в constraintlayout:2.0.0-alpha4. Когда я это делаю notifyDatasetChanged данные не обновляются. Он обновляется, когда я выполняю прокрутку
Правда обновил и стало еще хуже, раньше работало на первую загрузку, теперь бьет даже первая загрузка данных, пока не выполняется прокрутка
Похоже, alpha5 исправили все проблемы, однако прямо сейчас я провел быстрый тест, поэтому могут быть некоторые ситуации, в которых он не работает.
У меня была такая же проблема в альфа-версии 4. Обновился до бета-версии 1, и у меня тоже проблема исчезла.
@user2141889 user2141889 любое решение?
@JithishPN обновил макет движения до последней версии, проблема решена
@ user2141889 limitedlayout:2.0.0-beta1 Я использую этот. Все еще некоторые проблемы с прокруткой
RecyclerView.scrollBy(0, 0) как временное решение.
Ссылка на этот трекер проблем Google
В моем случае recyclerView.smoothScrollBy(0,1) помогло.
У меня почему-то RecyclerView.scrollBy(0, 0) не сработало. Я прокручиваю весь макет движения вверх, используя метод ниже, когда есть обновления для recyclerView.
motionLayoutView.transitionToStart()
Выяснил, что прокручивать его действительно нужно и возможно в анимированном виде, так что в моем случае помогла плавная прокрутка на 1 пиксель — recyclerView.smoothScrollBy(0,1). Некрасиво, но работает.
обновить до более новой версии
implementation 'androidx.constraintlayout:constraintlayout:2.0.0-beta7'
поскольку они исправили эту проблему, как указано в примечаниях к выпуску
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).
Ни один из этих обходных путей не работал для меня. Я отказался от их исправления и исправлял другие ошибки пользовательского интерфейса, которые у меня были. У меня есть несколько представлений, скользящих вверх/вниз и скрывающих/показывающих.
Я использовал TransitionManager.beginDelayedTransition(...) в своем коде, и он не был внутри Runnable. После такой упаковки в view.post{} проблема исчезла:
view.post{
TransitionManager.beginDelayedTransition()
}
Это может показаться неуместным, но я предлагаю проверить ваш код, чтобы увидеть, не находится ли проблема где-то еще. Как и все остальные, я думал, что это вызвано MotionLayout, потому что, когда я поменял его местами с ConstraintLayout, он работал нормально.
Пожалуйста, покажите нам свой макет и MotionScene, чтобы мы могли вам помочь.