【问题标题】:RecyclerView - Delete row always deletes the last oneRecyclerView - 删除行总是删除最后一个
【发布时间】:2018-08-25 17:51:44
【问题描述】:

在我的 MainActivity 中,我有一个 RecyclerView,我为此实现了滑动删除功能:

private val swipeHelper = object : ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT or ItemTouchHelper.RIGHT) {

    override fun onMove(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder, target: RecyclerView.ViewHolder): Boolean {
        return false
    }

    override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
        val position = viewHolder.adapterPosition //get position which is swipe

        if (direction == ItemTouchHelper.LEFT) {  //if swipe left
            deleteSwipe(position)
        } else {
            editSwipe(position)
        }
    }
    ...
}

这就是 deleteSwipe() 函数的样子:

private fun deleteSwipe(position: Int) {
        try {
            adapter.removeItem(position)
            ...
        } catch (e: IndexOutOfBoundsException) {}
    }

这是我在适配器中的removeItem(pos:Int) 函数:

fun removeItem(position: Int) {
    activeFiltered!!.removeAt(position)
    notifyDataSetChanged()
}

请注意,我故意使用 notifyDataSetChanged() 而不是 notifyItemRemoved(),因为我不想要动画。

问题是,无论我在列表中滑动哪个项目,被删除的始终是最后一个。我调试了位置变量,它是我所期望的,所以我真的不知道错误在哪里。

【问题讨论】:

  • 出于好奇,当你 notifyItemRemoved 传入位置变量时它是否正常工作?
  • 是的,它工作正常@WadeWilson
  • 再次尝试使用 notifyItemRemoved() 但在创建列表时删除项目动画器(在 RecyclerView 上调用 setItemAnimator(null))并查看它是否删除了正确的项目。
  • @WadeWilson 成功了,非常感谢您的帮助!
  • 我不知道为什么其他解决方案不起作用。可能是 RecyclerView 错误,但这是一个合适的解决方法,因为无论如何您都不想要动画。我要把它写成答案。

标签: android kotlin android-recyclerview


【解决方案1】:

我不确定为什么 notifyDataSetChanged() 会删除不正确的对象,但如果您不想要动画,您可以使用方法 setItemAnimator(ItemAnimator) 并传入 null 来禁用 Recyclerview 上的动画。而不是使用notifyDataSetChanged() 来通知RecyclerView 更改(这也是低效的),您应该调用方法notifyItemRemoved(int) 并传入您要删除的位置。这将禁用动画,并且只通知 RecyclerView 准确地删除了哪个项目(非常有效)。

【讨论】:

  • 非常感谢您的帮助,我将尽可能避免 notifyDataSetChanged,因为它最近弊大于利。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-05
  • 2015-10-10
  • 2019-03-24
  • 2017-08-25
  • 1970-01-01
相关资源
最近更新 更多