Kodak Gifted
Kodak Gifted

Reputation: 81

FragmentStateAdapter throws java.lang.IllegalStateException: Design assumption violated after configuration change

FragmentStateAdapter throws

java.lang.IllegalStateException: Design assumption violated,

when the device is rotated. How do I resolve this issue ?

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

Exception

 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)

Upvotes: 5

Views: 2629

Answers (2)

AskNilesh
AskNilesh

Reputation: 69709

This issue has been fixed now in ViewPager2

You need to use Version 1.0.0-beta03

Update the dependencies of ViewPager2

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

Bug fixes

  • Fix for FragmentStateAdapter issue with transient Fragment state. b/134246546

Upvotes: 1

Kodak Gifted
Kodak Gifted

Reputation: 81

I found the solution. Apparently you have to restore the state of FragmentStateAdapter after a configuration changed in other for the fragments to be restored properly.

Save state

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

Restore state

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

Upvotes: 1

Related Questions