当前位置: 首页 > 知识库问答 >
问题:

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

陆海阳
2023-03-14

FragmentStateAdapter抛出

java.lang.IllegalStateException: Design Assumption 违反了,

当设备旋转时。如何解决此问题?

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)

共有2个答案

杜俭
2023-03-14

此问题现已在ViewPager2中修复

您需要使用版本 1.0.0-beta03

更新 ViewPager2依赖项

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

错误修复

  • 修复了具有暂时性片段状态的片段状态Adapter 问题。 b/134246546
贡光明
2023-03-14

我找到了解决办法。显然,为了正确恢复片段,您必须在other中的配置发生更改后恢复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()
        ...
}
 类似资料:
  • 我自己无法复制这个问题,但我注意到这个问题是在小米米9运行的时候出现的。以下是我使用的和版本: 下面是StackTrace: 我不确定这是从我的代码中触发的,因为stacktrace不是很清楚。此外,根据Google Issuetracker,这个问题已经在viewpager2:1.0.0-beta03:https://Issuetracker.Google.com/issues/13424654

  • 当我想从其他线程向GUI添加节点时,我遇到了问题。它抛出非法状态异常,我不知道如何修复它。 我只是加载我的。FXML文件到GUI与此控制器,当程序启动时,它运行Thread负责与服务器(clientTH.start();)通信,一切正常。但是当服务器在初始化后发送数据时。并且我希望将此数据添加到我的仪表板,我像以前一样使用方法公共同步无效addToDashBoard(窗格根),但它抛出java.l

  • 我的验证器类 当我没有选择任何选项就提交表单时, 无法将类型java.lang.String的属性值转换为属性类别所需的类型com.main.java.category;嵌套异常为java.lang.IllegalStateException:无法将类型[java.lang.String]的值转换为属性类别所需的类型[com.main.java.category]:找不到匹配的编辑器或转换策略 这

  • Mario中所有的配置都可以在 Mario 全局唯一对象完成,将它设计为单例。 要运行起来整个框架,Mario对象是核心,看看里面都需要什么吧! 添加路由 读取资源文件 读取配置 等等 由此我们简单的设计一个Mario全局对象: /** * Mario * @author biezhi * */ public final class Mario { /** * 存放所有

  • Activity中有一个RecyclerView,通过getGroupList()获取数据,这是一个异步方法。 适配器,通过setData方法更新数据,当调用setData()notifyDataSetChanged()时,抛出java。语言:addInArray 可丢弃信息: addInArray被调用,这=android。支持v7.widget。RecyclerView{4295f4f0 VF

  • 我一直在尝试创建一个批处理文件,将笔记本电脑设置为高功率设置运行minecraft,然后在minecraft关闭时将电源设置设置为节能模式。我正试图发射装有我的techniclauncher的雷艇,目前我的蝙蝠看起来像这样。 启动电源 /s8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c 启动C:\Users\Eric\Downloads\TechnicLauncher。e