FragmentStateAdapter 抛出 java.lang.IllegalStateException:配置更改后违反设计假设

Kod*_*ted 5 android kotlin android-gradle-plugin android-viewpager2

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
        }
    }
Run Code Online (Sandbox Code Playgroud)

例外

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
        }
    }
Run Code Online (Sandbox Code Playgroud)

Kod*_*ted 1

我找到了解决方案。显然,在其他配置更改后,您必须恢复 FragmentStateAdapter 的状态才能正确恢复片段。

保存状态

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

恢复状态

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