在我的 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/