【发布时间】:2021-09-28 20:36:46
【问题描述】:
我正在将我的代码从使用 androidx.viewpager 更新为 androidx.viewpager2。我正在翻阅数量不定的片段,这些片段显示从数据库中检索到的数据记录。加载视图寻呼机并通过我的数据进行分页效果很好,但我在删除项目和更新寻呼机适配器时遇到了一些麻烦。我想通过在我的适配器上调用removeItem() 方法(参见下面的代码)来删除任何给定位置的项目。这应该从我的数据库以及我的片段中删除该项目,然后更新视图。
结果是从数据库中删除了正确的项目。但它不会从我的视图寻呼机中删除预期的片段,而是从下一页删除。当前页面仍然可见。我将位置稍微偏移了正负 1,但没有成功 - 相反:在这些情况下,我的删除例程按最初预期执行。我也尝试了与给定类似的考虑,例如here.
我想实现以下行为:
- 删除任何项目时,应删除该页面并显示列表中的下一个。
- 删除列表中最后一个/最右边的项目时,应删除该页面并显示上一个(现在是最后一个)页面。
- 删除最后一个剩余项目(没有剩余)时,活动应该完成。
我的适配器代码:
internal class ShapePagerAdapter(private val activity: AppCompatActivity) : FragmentStateAdapter(activity) {
private val dbManager: DatabaseManager
private var shapeIds: MutableList<String>? = null
init {
dbManager = DatabaseManager(activity)
try {
shapeIds = dbManager.getShapeIds()
} catch (e: DatabaseAccessException) {
// ...
}
}
override fun getItemCount(): Int {
return if (null != shapeIds) shapeIds!!.size else 0
}
override fun createFragment(position: Int): Fragment {
return ShapeFragment.newInstance(shapeIds!![position])
}
fun removeItem(activity: AppCompatActivity, position: Int) {
try {
// Remove from Database.
dbManager.deleteShape(shapeIds!![position])
// Remove from View Pager.
shapeIds!!.removeAt(position)
notifyItemRemoved(position)
notifyItemRangeChanged(position , itemCount)
// Close if nothing to show anymore.
if (itemCount == 0) {
activity.finish()
}
} catch (e: DatabaseAccessException) {
// ...
}
}
}
【问题讨论】:
-
为什么不检查
position是否是当前页面?您可能希望在删除之前切换页面。 -
@MartinZeitler 我可以这样做,但我将视图寻呼机的当前项目位置传递给 remove() 方法。我会在那里检查什么?是的,更改页面可能是一种选择,因为似乎可以删除上一页或下一页。恐怕我会让它变得过于复杂,因为这是早期的视图寻呼机处理的事情。但我明天会先试一试。谢谢!
-
@MartinZeitler 我尝试按照您的建议在删除之前切换页面并让它在某种程度上发挥作用,我认为它可以完全通过这种方式完成。处理所有可能的条件有点复杂。但是,与此同时,我发现让视图寻呼机处理它所缺少的东西(请参阅下面的答案)。无论如何,谢谢你的想法。
标签: android kotlin androidx android-viewpager2