如何判断Snackbar的Undo按钮是否被点击?
实现方案
核心思路是利用Snackbar.Callback监听 Snackbar 的消失事件,只有当 Snackbar 因超时或其他非「Undo」按钮点击的原因消失时,才执行数据库删除操作,避免冗余的先删后加。
修改 MainActivity 代码
val onSwipe = object : OnSwipe(this) { override fun onSwiped(viewHolder: ViewHolder, direction: Int) { val cachedPosition = viewHolder.absoluteAdapterPosition val cachedItem = adapter.listArray[cachedPosition] // 提前缓存要删除的item的ID,避免后续列表变化后无法获取 val itemIdToDelete = cachedItem.id.toString() when (direction) { ItemTouchHelper.RIGHT -> { adapter.removeItem(cachedPosition) Snackbar.make(binding.rv, "Deleted", Snackbar.LENGTH_SHORT) .apply { setAction("Undo") { adapter.restoreItem(cachedPosition, cachedItem) } // 添加Snackbar消失回调 addCallback(object : Snackbar.Callback() { override fun onDismissed(transientBottomBar: Snackbar?, event: Int) { super.onDismissed(transientBottomBar, event) // 判断消失原因:只有当不是点击Action按钮导致的消失,才执行数据库删除 if (event != DISMISS_EVENT_ACTION) { dbManager.removeItem(itemIdToDelete) } } }) show() } } } } }
补全数据库删除方法
你的removeItem方法未完成,补全SQLite的删除逻辑:
fun removeItem(_id: String) { val db = writableDatabase // 使用参数化查询避免SQL注入 db.delete("你的表名", "${BaseColumns._ID}=?", arrayOf(_id)) db.close() }
逻辑说明
- 滑动删除时,先从RecyclerView的列表中移除元素,同时缓存要删除的item和它的ID
- 弹出Snackbar,点击「Undo」时直接恢复列表元素,不涉及数据库操作
- 当Snackbar因超时、用户点击其他区域等非Action按钮的原因消失时,再调用数据库的删除方法,真正持久化删除数据
内容的提问来源于stack exchange,提问作者Антон Кузнецов
相关产品推荐
相关产品推荐

