问题
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)
回答1:
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()
...
}
回答2:
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
来源:https://stackoverflow.com/questions/57352437/fragmentstateadapter-throws-java-lang-illegalstateexception-design-assumption-v