RecyclerView - 正确实现SnackBar UNDO删除(Kotlin)

时间:2017-11-17 19:23:31

标签: android android-recyclerview kotlin

我已成功实施了滑动以从recyclerView中删除项目。

删除某个项目时,我想显示一个SnackBar,其中包含一个按钮,如果您无意中删除了该按钮,则可以添加该项目。

我选择将刷过的项目存储在变量中并将其删除。

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

我就这样做了:

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<View>(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中重新添​​加。我做错了什么?

1 个答案:

答案 0 :(得分:1)

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

adapter!!.removeItem(position)

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

然而,undo方法不使用@Submerged指出的适配器列表,尝试创建等效方法

adapter!!.addItem(position)

目前您正在将项目添加到其他列表对象,而不是适配器使用的项目,因此不会更新任何内容。

P.S调用notifyItemInserted(用于动画)或notifyDataSetChanged(批量更改数据,无动画),而不是两者