android - 如何处理错误:“违反设计假设”。使用 FragmentStateAdapter 时
问题描述
大家好,我正在使用 ViewPager 和 FragmentStateAdapter。我有一个选项供用户在添加的片段之一中重新创建活动(方法调用:)activity.recreate()
。但是,如果重新创建活动,我会收到以下错误:
java.lang.IllegalStateException: Design assumption violated.
at androidx.viewpager2.adapter.FragmentStateAdapter.placeFragmentInViewHolder(FragmentStateAdapter.java:287)
at androidx.viewpager2.adapter.FragmentStateAdapter.onViewAttachedToWindow(FragmentStateAdapter.java:276)
at androidx.viewpager2.adapter.FragmentStateAdapter.onViewAttachedToWindow(FragmentStateAdapter.java:67)
at androidx.recyclerview.widget.RecyclerView.dispatchChildAttached(RecyclerView.java:7556)
at androidx.recyclerview.widget.RecyclerView$5.addView(RecyclerView.java:860)
at androidx.recyclerview.widget.ChildHelper.addView(ChildHelper.java:107)
at androidx.recyclerview.widget.RecyclerView$LayoutManager.addViewInt(RecyclerView.java:8601)
这是我的 FragmentStateAdapter:
class MainViewPagerAdapter(fragmentActivity: FragmentActivity) :
FragmentStateAdapter(fragmentActivity) {
var fragmentList: ArrayList<Fragment> = arrayListOf()
override fun getItemCount(): Int = fragmentList.size
//Put all the fragments needed based on position
override fun createFragment(position: Int): Fragment {
return fragmentList[position]
}
fun add(fragment: Fragment) {
fragmentList.add(fragment)
notifyDataSetChanged()
}
fun addByPosition(position: Int, fragment: Fragment) {
fragmentList.add(position, fragment)
notifyDataSetChanged()
}
fun remove(index: Int) {
fragmentList.removeAt(index)
notifyDataSetChanged()
}
override fun getItemId(position: Int): Long {
return fragmentList[position].hashCode().toLong()
}
override fun containsItem(itemId: Long): Boolean {
return fragmentList.contains(itemId)
}}
我在用:
implementation "androidx.viewpager2:viewpager2:1.0.0"
我已经尝试了以下方法:
- 删除 getItemId() -> 有效,但我需要重写此方法,以便在从适配器添加/删除片段时保留所有元素的正确位置
- 试图将片段列表保存在其中
onSaveInstanceState(outState: Bundle)
并将其传递回适配器,但我得到了同样的错误。
我究竟做错了什么?处理此错误的最佳方法是什么?
解决方案
推荐阅读
- node.js - 解密的字符串在后续节点会话中未正确编码
- php - 当我推送新版本的应用程序时,为什么在 Heroku 上删除了许多上传的文件?
- typescript - 如何在 Typescript 中将属性附加到泛型类型?
- double - 超过时间限制,答案被跳过
- java - 如何使用 url 在 tetelgram bot 中下载和发送 .exe 文件?
- payment-gateway - 向用户flutterwave ravepay收取横断费?
- swift - 如何为 UITableViewCell 的子视图禁用 UITapGesture?
- unit-testing - 使用 ctest 安装单元测试以供以后执行
- git - Git Hook 与 Github 的连接超时 - 是否有我可以绑定的“预发送”Git 钩子?
- javascript - selectpicker不是一个函数吗?