Kotlin实现侧滑删除撤销及恢复最近删除项的方法
实现Snackbar Undo恢复删除项的方案
核心思路
先暂存被删除的任务及其位置,点击Undo按钮时将任务插回原列表位置并恢复数据库记录。
具体实现步骤
- 在Adapter类中添加暂存变量
在Adapter类里定义两个变量,用来保存被删除的任务和它的位置:
private var deletedTask: Task? = null // Task替换成你实际的数据实体类名 private var deletedPosition: Int = -1
- 修改侧滑删除的逻辑
调整onViewSwiped方法,先暂存数据再执行删除,同时在Undo按钮点击事件中实现恢复逻辑:
override fun onViewSwiped(position: Int) { // 暂存被删除的任务和位置 deletedTask = list[position] deletedPosition = position // 从列表移除并更新UI list.removeAt(position) notifyItemRemoved(position) updateNotesPositionInDb() // 删除数据库中的任务 deleteTask(deletedTask!!.ID) // 显示Snackbar,建议改用LONG或INDEFINITE时长 val snackbar = Snackbar.make((context as Activity).findViewById(R.id.mainLayout), "任务已删除", Snackbar.LENGTH_LONG) snackbar.setAction("撤销") { deletedTask?.let { task -> // 将任务插回原位置 list.add(deletedPosition, task) notifyItemInserted(deletedPosition) updateNotesPositionInDb() // 恢复数据库中的任务记录 insertTask(task) // 替换成你实际的插入数据库方法 } // 清空暂存数据 deletedTask = null deletedPosition = -1 } snackbar.show() }
注意事项
- Snackbar时长:建议使用
LENGTH_LONG或LENGTH_INDEFINITE,给用户足够时间点击撤销按钮;LENGTH_INDEFINITE会一直显示直到用户操作。 - 数据库操作:确保你有对应的插入任务方法(比如
insertTask),如果使用Room,直接调用DAO的插入接口即可。 - 空安全处理:用
let判断deletedTask不为空再执行恢复,避免空指针异常。 - 位置更新:恢复后要调用
updateNotesPositionInDb(),保证数据库中任务的位置信息和列表一致。
内容的提问来源于stack exchange,提问作者Khumo Mashapa
相关产品推荐
相关产品推荐

