При отображении горизонтального списка в BottomSheetDialogFragment происходит краш
Хочу показать модальный BottomSheetDialogFragment с картинками и способами шаринга в виде горизонтального списка. Картинки анимируются по средством ViewPropertyAnimator, при этом под картинками находится горизонтальный список RecyclerView, с достаточно примитвной версткой:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical">
<include
android:id="@+id/iconLayout"
layout="@layout/share_icon_item" />
<TextView
android:id="@+id/shareVariantName"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
сам share_icon_item.xml
<?xml version="1.0" encoding="utf-8"?>
<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/shareVariantImage"
android:layout_width="@dimen/share_variant_size"
android:padding="@dimen/spacing_16"
android:layout_height="@dimen/share_variant_size"
android:background="@drawable/shadow"
tools:src="@drawable/ic_gallery" />
верстка для BottomSheetDialogFragment:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<FrameLayout
android:id="@+id/resultContentContainer"
android:layout_width="112dp"
android:layout_height="200dp"
android:layout_marginTop="60dp"
android:layout_marginBottom="40dp"
app:layout_constraintBottom_toBottomOf="@id/shareMessage"
app:layout_constraintDimensionRatio="H, 4:3"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<ImageView
android:id="@+id/imageResult"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/share_preset_rounded_corners_background"
android:visibility="gone"
tools:visibility="gone" />
<VideoView
android:id="@+id/videoResult"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/share_preset_rounded_corners_background"
android:visibility="gone" />
</FrameLayout>
<ImageView
android:id="@+id/leftImage"
android:layout_width="56dp"
android:layout_height="56dp"
android:background="@drawable/share_preset_rounded_corners_background"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="@id/flResultContainer"
app:layout_constraintStart_toStartOf="@id/flResultContainer"
tools:visibility="visible" />
<ImageView
android:id="@+id/topImage"
android:layout_width="48dp"
android:layout_height="60dp"
android:background="@drawable/share_preset_rounded_corners_background"
android:visibility="gone"
app:layout_constraintStart_toStartOf="@id/flResultContainer"
app:layout_constraintTop_toTopOf="@id/flResultContainer"
tools:visibility="visible" />
<ImageView
android:id="@+id/bottomImage"
android:layout_width="64dp"
android:layout_height="80dp"
android:background="@drawable/share_preset_rounded_corners_background"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="@id/flResultContainer"
app:layout_constraintEnd_toEndOf="@id/flResultContainer"
tools:visibility="visible" />
<TextView
android:id="@+id/shareMessage"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toTopOf="@id/rvShareVariants"
tools:text="Share link to give access
to your content"/>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/shareVariants"
android:layout_width="0dp"
android:layout_height="96dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
android:orientation="horizontal"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
tools:listitem="@layout/share_variant_item" />
</androidx.constraintlayout.widget.ConstraintLayout>
Адаптер и список я инициализирую внутри onViewCreated, а данные в список кладу через подписку на лайвдату. Сет данных в адаптер происходит так:
var items: List<ShareVariant> = emptyList()
set(value) {
field = value
notifyDataSetChanged()
}
Когда BottomSheetDialogFragment открывается через show(FragmentManager, Tag), то приложение падает с ошибкой
java.lang.IllegalArgumentException: Scrapped or attached views may not be recycled. isScrap:false isAttached:true androidx.recyclerview.widget.RecyclerView{8b5d225 VFED..... ......ID 0,900-1080,1188 #7f0a0292 app:id/shareVariants}, adapter:com.example.app.ui.share.preset.ShareVariantAdapter@6457b13, layout:com.example.app.ui.share._base.LinearLayoutManager@ac76150, context:android.view.ContextThemeWrapper@30c79eb
Насколько я понял это потому, что элементы во время фазы переиспользования имеют родителя который не равен null.
Погуглил похожие штуки:
- Убирание animateLayoutChanges - не работает
- hasStableIds и переопределение getItemId - не работает
- Убирание префетча тоже не работает