首页 > 解决方案 > 如何处理错误:“违反设计假设”。使用 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"

我已经尝试了以下方法:

  1. 删除 getItemId() -> 有效,但我需要重写此方法,以便在从适配器添加/删除片段时保留所有元素的正确位置
  2. 试图将片段列表保存在其中onSaveInstanceState(outState: Bundle)并将其传递回适配器,但我得到了同样的错误。

我究竟做错了什么?处理此错误的最佳方法是什么?

标签: androiderror-handlingandroid-viewpagerfragmentstatepageradapter

解决方案


推荐阅读