Android 删除viewPager2中的片段使用FragmentStateAdapter,但仍显示

Android 删除viewPager2中的片段使用FragmentStateAdapter,但仍显示,android,android-viewpager,fragmentstatepageradapter,android-viewpager2,Android,Android Viewpager,Fragmentstatepageradapter,Android Viewpager2,我有一个viewPager2和FragmentStateAdapter,还有Fragment1、2、3和4,我在fragment2中,希望删除fragment3,并在fragment2之后显示fragment4。 问题是它总是显示fragment3(数据),调试显示fragment3已被删除,但显示的页面仍有fragment3内容 主持人: class TipsAdapter( private val items: MutableList<TripPage>, context: Fr

我有一个viewPager2和FragmentStateAdapter,还有Fragment1、2、3和4,我在fragment2中,希望删除fragment3,并在fragment2之后显示fragment4。 问题是它总是显示fragment3(数据),调试显示fragment3已被删除,但显示的页面仍有fragment3内容

主持人:

class TipsAdapter(
private val items: MutableList<TripPage>,
context: FragmentActivity
) : FragmentStateAdapter(context) {

private val fragmentFactory = context.supportFragmentManager.fragmentFactory
private val classLoader = context.classLoader

override fun getItemCount(): Int = items.size

override fun createFragment(position: Int): Fragment {
    val pageInfo = items[position]
    val fragment = fragmentFactory.instantiate(classLoader, pageInfo.fragmentClass.name)
    fragment.arguments = Bundle().also { it.putParcelable(PAGE_INFO, pageInfo) }
    return fragment
}

fun getFragmentName(position: Int) = items[position].fragmentClass.simpleName

fun removeFragment(position: Int) {
    items.removeAt(position)
    notifyItemRemoved(position)
    notifyItemRangeChanged(position, items.size)
    notifyDataSetChanged()
}

最后,它对我有用。当我们调用notifyDataSetChanged()时,android将调用 方法
getItemId()
,检查项目是否已更新。它返回源代码中的位置。这意味着在列表
0..i..n
中,如果删除
i
,它将变为
0..i..n-1
,则
i
不会更改,数据也不会在适配器中更新

    /**
 * Default implementation works for collections that don't add, move, remove items.
 * <p>
 * TODO(b/122670460): add lint rule
 * When overriding, also override {@link #containsItem(long)}.
 * <p>
 * If the item is not a part of the collection, return {@link RecyclerView#NO_ID}.
 *
 * @param position Adapter position
 * @return stable item id {@link RecyclerView.Adapter#hasStableIds()}
 */
@Override
public long getItemId(int position) {
    return position;
}

请找到更多有用的信息:哇,你太棒了!你拯救了这一天:)Cheers@Xianwei这是API的一个完全不同的部分,不幸的是不相关。我花了几个小时试图解决这个问题。不幸的是,Android并不总是直观的,关于这些用例的文档也不完整。我有两个片段mainfragment和otherfragment。我在每5个位置添加otherfragment,它不在arraylist中,所以如果它不在列表中,如何删除该otherfragment?我有2个片段mainfragment和otherfragment。我在每5个位置添加otherfragment,但它不在arraylist中,所以如果它不在列表中,如何删除该otherfragment?我正在使用viewpager2
    /**
 * Default implementation works for collections that don't add, move, remove items.
 * <p>
 * TODO(b/122670460): add lint rule
 * When overriding, also override {@link #containsItem(long)}.
 * <p>
 * If the item is not a part of the collection, return {@link RecyclerView#NO_ID}.
 *
 * @param position Adapter position
 * @return stable item id {@link RecyclerView.Adapter#hasStableIds()}
 */
@Override
public long getItemId(int position) {
    return position;
}
class TipsAdapter(
     private val items: MutableList<TripPreferencesOptimizerPage>,
     context: FragmentActivity
    ) : FragmentStateAdapter(context) {

private val fragmentFactory = context.supportFragmentManager.fragmentFactory
private val classLoader = context.classLoader
private val pageIds= items.map { it.hashCode().toLong() }

override fun getItemCount(): Int = items.size

override fun createFragment(position: Int): Fragment {
    val pageInfo = items[position]
    val fragment = fragmentFactory.instantiate(classLoader, pageInfo.fragmentClass.name)
    fragment.arguments = Bundle().also { it.putParcelable(PAGE_INFO, pageInfo) }
    return fragment
}

fun getFragmentName(position: Int) = items[position].fragmentClass.simpleName

fun removeFragment(position: Int) {
    items.removeAt(position)
    notifyItemRangeChanged(position, items.size)
    notifyDataSetChanged()
}

override fun getItemId(position: Int): Long {
    return items[position].hashCode().toLong() // make sure notifyDataSetChanged() works
}

override fun containsItem(itemId: Long): Boolean {
    return pageIds.contains(itemId)
}
}