首页 > 解决方案 > Android在ViewPager2上删除片段

问题描述

我在这里以带有 Fragments 的 ViewPager2 为例。当我删除第一个位置时,片段仍在显示。您对这种情况有什么建议吗?

class PagerAdapter(
    private var activity: FragmentActivity,
    private var itemCount: Int,
    private val conversationId: Long,
    private val currentMediaOffset: Int,
    private val callBack: PhotoViewerActivity.OnPageListener
): FragmentStateAdapter(activity) {
val list = mutableListOf<SwipePhotoViewerFragment>()
override fun createFragment(position: Int): Fragment {
    if (position < list.size) {
        list[position].setCallback(callBack)
        return list[position]
    }

    val fragment = SwipePhotoViewerFragment.create(
            conversationId,
            position,
            currentMediaOffset
    )
    fragment.setCallback(callBack)
    list.add(fragment)

    return fragment
}

override fun getItemCount(): Int {
    return itemCount
}

fun removeItem(position: Int) {
    val fragmentManager = activity.supportFragmentManager
    fragmentManager.beginTransaction().remove(list[position]).commit()
    list.removeAt(position)
    itemCount--
    notifyItemRangeRemoved(position, 1)
    notifyDataSetChanged()
}
}

标签: androidandroid-fragmentsandroid-viewpager2

解决方案


当我们调用时notifyDataSetChanged(),android会调用getItemId()adapter中的方法,检查item是否已经更新,然后返回源代码中的位置。这基本上意味着在列表中如果你有类似 0-1-2-3-4-5 的东西,如果你删除 i=2 位置,它变成 0-1-2-3-4 但奇怪的是i不会更改并且数据不会在适配器中更新。

所以你要做的是覆盖getItemId()

val listOfData :MutableList<*> = ArrayList()

override fun getItemId(position: Int): Long 
{
    return lisfOfData[position].hashCode().toLong()
}

这将确保每个片段都是唯一的并且在适配器中更新。


推荐阅读