如何在viewpager2中的FragmentStateAdapter中通知ItemRemove片段

时间:2021-01-20 08:37:01

标签: kotlin android-viewpager2 fragmentstateadapter

我想从 viewpager2 适配器中删除项目,但是当通知适配器(FragmentStateAdapter)活动崩溃并给出以下错误时:

   java.lang.IndexOutOfBoundsException: Index: 36, Size: 36
    at java.util.ArrayList.get(ArrayList.java:437)
    at com.libramee.ui.category.adapter.CategoryPagerAdapter.remove(CategoryPagerAdapter.kt:61)
    at com.libramee.ui.home.fragment.HomeFragment$observe$2.onChanged(HomeFragment.kt:218)
    at com.libramee.ui.home.fragment.HomeFragment$observe$2.onChanged(HomeFragment.kt:45)

HomeFragment.kx:

  deleteCategoryLiveData?.observe(viewLifecycleOwner, Observer {
        if (it.status == Response.Status.SUCCESS){              
            adapter?.remove(it.message ?:"")            
        }
    })

CategoryPagerAdapter.kx

class CategoryPagerAdapter(fragment: Fragment, var categoryFragments: ArrayList<Fragment>) : 
   FragmentStateAdapter(fragment) {

override fun getItemCount(): Int {
    return categoryFragments.size
}

override fun createFragment(position: Int): Fragment {
    return categoryFragments.get(position)
}

fun setFragments(categoryFragments: ArrayList<Fragment>){
//    this.categoryFragments.clear()
    this.categoryFragments.addAll(categoryFragments)
    notifyDataSetChanged()
}


fun setNewFragments(categoryFragments: ArrayList<Fragment>){
    this.categoryFragments.clear()
    this.categoryFragments.addAll(categoryFragments)
    notifyDataSetChanged()
}

fun addFragment(categoryFragment: Fragment){
    this.categoryFragments.add(categoryFragment)
    notifyDataSetChanged()
}

fun remove(index: Int){
    if (itemCount > 0) {
        this.categoryFragments.removeAt(itemCount - 1)
        notifyDataSetChanged()
    }
}
fun remove(categoryId: String){
    categoryFragments.forEachWithIndex { i, it ->
        if (it is CategoryProductFragment){
            if (it.categoryId.equals(categoryId)){
                categoryFragments.removeAt(i) // i == 34
                notifyItemRangeChanged(0, categoryFragments.size)
                notifyDataSetChanged()
                return@forEachWithIndex
            }
        }
    }
}
fun getAllFragments(): ArrayList<Fragment> {
    return categoryFragments
}

}

是使用删除函数,删除的index(i)是34:

  fun remove(categoryId: String){
    categoryFragments.forEachWithIndex { i, it ->
        if (it is CategoryProductFragment){
            if (it.categoryId.equals(categoryId)){
                categoryFragments.removeAt(i) // i == 34
                notifyItemRangeChanged(0, categoryFragments.size)
                notifyDataSetChanged()
                return@forEachWithIndex
            }
        }
    }
}

我不知道修复这个错误! 你知道我该如何修复这个错误吗????

0 个答案:

没有答案
相关问题