RecyclerView – 正确实施SnackBar UNDO删除(Kotlin)

我已经成功实施了swipe从recyclerView删除一个项目。

当一个项目被删除,我想顶部显示一个SnackBar的按钮,让我们添加项目,如果你无意删除。

我选择将滑过的项目存储在variables中并将其删除。

然后,如果用户按下撤消按钮,它将被添加回原来的位置。

这是我做到的:

override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) { val position = viewHolder.adapterPosition //get position which is swipe if (direction == ItemTouchHelper.LEFT) { //if swipe left val tmp = activeSubs[position] //here I store the temporary Item activeSubs.removeAt(position) adapter!!.removeItem(position) //TODO: translate val layout = find(R.id.active_subs_recycler) Snackbar.make(layout, "Subscription Deleted", Snackbar.LENGTH_LONG) .setAction("Undo", { _ -> activeSubs.add(position-1, tmp) adapter!!.notifyItemInserted(position-1) adapter!!.notifyDataSetChanged() }).show() } } 

问题是,当我点击UNDO按钮,该项目不会被添加回recyclerView 。 我究竟做错了什么?

您有一个适配器方法删除项目

 adapter!!.removeItem(position) 

即从适配器列表中删除项目并通知回收站视图。

但是,撤消方法不会使用@Submerged指出的适配器列表,请尝试创建等效的方法

 adapter!!.addItem(position) 

因为目前您将该项目添加到不同的列表对象,而不是适配器使用的项目,所以没有更新。

PS调用notifyItemInserted(对于animation)或notifyDataSetChanged(批量更改数据,没有animation),而不是