You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin实现侧滑删除撤销及恢复最近删除项的方法

实现Snackbar Undo恢复删除项的方案

核心思路

先暂存被删除的任务及其位置,点击Undo按钮时将任务插回原列表位置并恢复数据库记录。

具体实现步骤

  1. 在Adapter类中添加暂存变量
    在Adapter类里定义两个变量,用来保存被删除的任务和它的位置:
private var deletedTask: Task? = null // Task替换成你实际的数据实体类名
private var deletedPosition: Int = -1
  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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 01:45:35