FragmentStateAdapter выдает java.lang.IllegalStateException: предположение о конструкции нарушено после изменения конфигурации

Выдает FragmentStateAdapter

java.lang.IllegalStateException: предположение о конструкции нарушено,

при вращении устройства. Как решить эту проблему?

private inner class PagerAdapter : FragmentStateAdapter(this) {
        private val ids = LongSparseArray<Media>()

        override fun getItemCount(): Int = adapter.itemCount

        override fun getItemId(position: Int): Long {
            return adapter.source!![position].time
        }

        override fun containsItem(itemId: Long): Boolean {
            return ids[itemId] != null
        }
    }

Исключение

 java.lang.IllegalStateException: Design assumption violated.
        at androidx.viewpager2.adapter.FragmentStateAdapter.placeFragmentInViewHolder(FragmentStateAdapter.java:270)
        at androidx.viewpager2.adapter.FragmentStateAdapter.onViewAttachedToWindow(FragmentStateAdapter.java:259)
        at androidx.viewpager2.adapter.FragmentStateAdapter.onViewAttachedToWindow(FragmentStateAdapter.java:68)

person Kodak Gifted    schedule 05.08.2019    source источник
comment
опубликуйте свой файл градации   -  person Manoj Perumarath    schedule 05.08.2019
comment
Журнал ошибок указывает на ошибку в методе placeFragmentInViewHolder в FragmentStateAdapter, которая отсутствует в вашем коде. Пожалуйста, включите этот метод в свой код.   -  person sunil sunny    schedule 05.08.2019


Ответы (2)


Я нашел решение. По-видимому, вам нужно восстановить состояние FragmentStateAdapter после изменения конфигурации в другом для правильного восстановления фрагментов.

Сохранить состояние

override fun onSaveInstanceState(outState: Bundle) {
        super.onSaveInstanceState(outState)
        model.addState(IDS, pagerAdapter.ids)
        model.addState(LIST, (adapter.source as ListAdapterSource).getList())
    }

Восстановить состояние

private inner class PagerAdapter : FragmentStateAdapter(this) {
        val ids: LongSparseArray<Media> = model.getState(IDS) ?: LongSparseArray()
        ...
}
person Kodak Gifted    schedule 05.08.2019

Эта проблема исправлена ​​в версии ViewPager2.

Вам необходимо использовать Version 1.0.0-beta03

Обновите dependencies из ViewPager2

 dependencies {
    implementation 'androidx.viewpager2:viewpager2:1.0.0-beta03'
 }

Исправление ошибок

  • Исправлена ​​ошибка FragmentStateAdapter с временным состоянием фрагмента. b/134246546
person AskNilesh    schedule 08.08.2019
comment
По-видимому, у меня возникает та же проблема со стабильной версией ViewPager2 1.0.0. Не уверен, почему это может быть. - person waseefakhtar; 15.01.2020