RecyclerView-删除行始终删除最后一个

时间:2018-08-24 13:17:25

标签: android android-recyclerview kotlin recycler-adapter

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

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

1 个答案:

答案 0 :(得分:3)

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