android - 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()
}
}
解决方案
当我们调用时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()
}
这将确保每个片段都是唯一的并且在适配器中更新。
推荐阅读
- android - 语言在 API 级别 24 以上不变
- java - 我有这个错误 java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
- javascript - 如何以文本框数字格式(如 44.44)执行验证
- javascript - 选项卡式菜单 - 如果列表项处于活动状态,则在子菜单旁边的额外 `div` 中显示页面摘录
- hive - 如何基于列评估多行
- machine-learning - 回归的特征选择过程
- reactjs - 循环中的父子组件事件处理程序
- selenium - 黄瓜扩展报告中的错误(java.lang.ClassNotFoundException:com.cucumber.listener.ExtentCucumberFormatter)
- java - Google Cloud Speech To Text 给出 0 结果
- shell - 当脚本失败时,它不会执行 echo "TEXT" >> FILE