在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()
,因为我不想使用动画。
问题在于,无论我滑动列表中的哪个项目,被删除的项目始终是最后一个。我调试了位置变量,这是我期望的位置变量,所以我真的不知道错误在哪里。
答案 0 :(得分:3)
我不确定为什么notifyDataSetChanged()
会删除不正确的对象,但是如果您不想使用动画,则可以使用方法setItemAnimator(ItemAnimator)
并在null
中传递,从而在Recyclerview上禁用动画。而不是使用notifyDataSetChanged()
来通知RecyclerView更改(这也是无效的),您应该调用方法notifyItemRemoved(int)
并传递要删除的位置。这将禁用动画,并且仅将被删除的项目准确地通知RecyclerView(非常有效)。