当前位置: 首页 > 知识库问答 >
问题:

删除Android ViewPager2中的项目

鲜于意
2023-03-14

我正在将我的代码从使用< code>androidx.viewpager更新为< code>androidx.viewpager2。我正在翻阅一个不确定数量的片段,这些片段显示了从数据库中检索到的数据记录。加载视图分页器并对我的数据进行分页运行得很好,但是我在删除项目和更新分页器适配器时遇到了一些问题。我想通过调用我的适配器上的< code>removeItem()方法(参见下面的代码)在任何给定位置删除一个项目。这应该会从我的数据库和我的片段中删除项目,然后更新视图。

结果是从数据库中删除正确的项。但它不会从我的视图寻呼机中删除预期的片段,而是从下一页中删除。当前页面仍然可见。我有点用正负1来抵消位置,但没有成功 - 相反:在这些情况下,我的删除例程按最初预期执行。我也尝试了类似的考虑因素,例如在这里。

我希望实现以下行为:

  1. 删除任何项目时,应删除该页面,并显示列表中的下一个页面。
  2. 删除列表中最后一个/最右边的项目时,应删除该页面并显示上一个(现在是最后一个)页面。
  3. 删除最后一个剩余项目(未剩下任何项目)时,活动应完成。

我的适配器代码:

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) {
            // ...
        }
    }
}

共有1个答案

方宏才
2023-03-14

对< code > FragmentStateAdapter 的进一步研究表明,在这种情况下必须重写它的两个方法:

包含项目(长itemId)getItemId(int位置)

默认实现适用于不添加、移动或移除项的集合。

在搜索中,我找到了一个类似问题的答案,为我指明了正确的方向。它没有产生我问题中给出的确切行为,这就是为什么我发布了一个稍微改编的版本。

关键是这两种方法是在项目序列可能发生变化的情况下实现的。为了启用此功能,我维护了项目和项目ID的映射,并在序列发生变化时更新,在这种情况下是删除的项目。

internal class ShapePagerAdapter(private val activity: AppCompatActivity) : FragmentStateAdapter(activity) {
    private val dbManager: DatabaseManager
    private lateinit var shapeIds: MutableList<String>
    private lateinit var itemIds: List<Long>

    init {
        dbManager = DatabaseManager(activity)
        try {
            shapeIds = dbManager.getShapeIds()
            updateItemIds()
        } catch (e: DatabaseAccessException) {
            // ...
        }
    }

    override fun getItemCount(): Int = shapeIds.size

    override fun createFragment(position: Int): Fragment = ShapeFragment.newInstance(shapeIds[position])

    fun removeItem(activity: AppCompatActivity, position: Int) {
        try {
            dbManager.deleteShape(shapeIds[position])
            shapeIds.removeAt(position)
            notifyItemRemoved(position)
            notifyItemRangeChanged(position , itemCount)
            updateItemIds()
            if (itemCount == 0) activity.finish()
        } catch (e: DatabaseAccessException) {
            // ...
        }
    }

    private fun updateItemIds() {
        itemIds = shapeIds.map { it.hashCode().toLong() }
    }

    override fun getItemId(position: Int): Long = shapeIds[position].hashCode().toLong()

    override fun containsItem(itemId: Long): Boolean = itemIds.contains(itemId)
    }
}
 类似资料:
  • 问题内容: 我是React的新手,制作了一个可以保存搜索的应用程序。这将提取JSON,但当前正在从静态数组中提取。我无法从搜索列表中删除搜索。 这是jsbin:http://jsbin.com/nobiqi/edit?js,输出 这是我的删除按钮元素: 和我的功能 我尝试了以下教程,但不确定从这里开始。如何删除搜索项目? 问题答案: 我猜,您是否正在寻找类似的东西? 在此示例中,请注意我如何绑定方

  • 本文向大家介绍sharepoint 删除列表中的项目,包括了sharepoint 删除列表中的项目的使用技巧和注意事项,需要的朋友参考一下 示例            

  • 我有一个假设,它有8个项目A-H,现在我想从中删除存储在int数组中的1,3,5位置项目。我该怎么做。 我正试着和你一起做这件事 但在数组的第一个被删除的项被更改之后,在下一次迭代中它删除了错误的元素或给出异常。

  • 我正面临一个问题,我无法删除RecycerView中的一个项目。我试图在互联网上搜索,但无法看到任何解决方案,我遵循这篇文章Android Recycerview添加和删除项目,但我仍然无法删除下面选择的项目是我的适配器和碎片的代码 RecyclerViewAdapter.java

  • 我对下面的Java程序有问题。我在Ubuntu系统上使用带有JDK-1.8u25的JavaFX。我想显示一个ListView,并从列表中删除突出显示的条目。我创建了一个列表,并将其与一个可观察列表配对,以通知侦听器事件。然而,通过删除下面的“orderOvList.remove(i,i 1)”项来更改列表似乎会生成另一个侦听器事件。所以,我似乎在侦听器代码的主体中递归。我想过将list元素从nor

  • 我正在用C#WPF做一个项目,它包含在一个客户机管理中,在那里我添加了新的客户机,在一个txt文档中有save,我有一个listview,在那里我可以看到所有添加的客户机,但现在我想实现一个delete按钮,在那里我从listview中选择一个客户机,并可以删除它。如果我现在做的正确,如果有人能帮我…,…谢谢。