Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/193.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android RecyclerView-删除行始终删除最后一行_Android_Kotlin_Android Recyclerview - Fatal编程技术网

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

Android RecyclerView-删除行始终删除最后一行,android,kotlin,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.View

在我的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) {}
    }
下面是适配器中我的
removietem(pos:Int)
函数:

fun removeItem(position: Int) {
    activeFiltered!!.removeAt(position)
    notifyDataSetChanged()
}
注意,我故意使用了
notifyDataSetChanged()
而不是
notifyItemRemoved()
,因为我不想要动画


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

我不确定为什么
notifyDataSetChanged()
正在删除不正确的对象,但是如果您不想要动画,可以使用该方法在Recyclerview上禁用动画,并传入
null
。与使用
notifyDataSetChanged()
通知RecyclerView更改(这也是低效的)不同,您应该调用该方法并将其传递到要删除的位置。这将禁用动画,并仅通知RecyclerView确切地删除了哪个项目(非常有效)。

出于好奇,当您传入位置变量notifyItemRemoved时,它是否正常工作?是的,它再次使用notifyItemRemoved()在@WadeWilson下正常工作,但在创建列表时,请删除项目animator(在RecyclerView上调用setItemAnimator(null)并查看它是否删除了正确的项。@WadeWilson它成功了,非常感谢您的帮助!我不知道为什么其他解决方案不起作用。可能是RecyclerView错误,但这是一个合适的解决方法,因为您无论如何都不需要动画。我将把它作为一个答案来写。非常感谢您的帮助,我将避免在任何时候更改notifyDataSetChanged可以,因为它最近弊大于利。