【发布时间】:2018-08-25 17:51:44
【问题描述】:
在我的 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(),因为我不想要动画。
问题是,无论我在列表中滑动哪个项目,被删除的始终是最后一个。我调试了位置变量,它是我所期望的,所以我真的不知道错误在哪里。
【问题讨论】:
-
出于好奇,当你 notifyItemRemoved 传入位置变量时它是否正常工作?
-
是的,它工作正常@WadeWilson
-
再次尝试使用 notifyItemRemoved() 但在创建列表时删除项目动画器(在 RecyclerView 上调用 setItemAnimator(null))并查看它是否删除了正确的项目。
-
@WadeWilson 成功了,非常感谢您的帮助!
-
我不知道为什么其他解决方案不起作用。可能是 RecyclerView 错误,但这是一个合适的解决方法,因为无论如何您都不想要动画。我要把它写成答案。
标签: android kotlin android-recyclerview