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),而不是