android - RecyclerView - 删除行总是删除最后一行

标签 android kotlin android-recyclerview

在我的 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(),因为我不想要动画。

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

最佳答案

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

关于android - RecyclerView - 删除行总是删除最后一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52005367/

相关文章:

java - 如何点击 jsonobject/listview 提要项?

android - 嵌套导航时,导航的返回堆栈丢失

PreferenceFragment 的 android 兼容性 API 替代品

kotlin - 了解包含点和括号的 lambda 构造

java - 每个请求在 VertX 中设置单独的超时

android - Android + Gradle生成代码版本

unit-testing - Mockito never() 不与 andThen rxjava2 一起使用

android - CoordinatorLayout 内的水平 RecyclerView

android - 如果底部空间不足,如何更改 showAsDropdown 弹出窗口的位置?

android - RecyclerView 和保存+检索每个适配器项的临时状态