Android RecyclerView-删除行始终删除最后一行
在我的MainActivity中,我有一个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
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可以,因为它最近弊大于利。