Kotlin实现滑动删除RecyclerView条目并同步删除Cloud Firestore数据问题排查
问题核心原因
你当前deleteBoard方法传入的文档ID是固定常量Constants.DOCUMENT_ID的值(也就是字符串"documentId"),不是你要删除的对应条目真实的文档ID,所以Firestore根本找不到要删除的目标文档,自然不会执行删除操作。
需要修改的代码逻辑
1. 修改Firestore类的deleteBoard方法,新增参数接收实际文档ID
// 新增参数接收要删除的目标文档真实ID fun deleteBoard(documentId: String){ mFireStore.collection(Constants.BOARDS).document(documentId).delete() }
2. 修改适配器的del方法,获取对应位置条目的文档ID传给删除接口
你适配器中存储的Board对象本身就携带documentId属性,删除前先取出对应位置的文档ID即可:
fun del(position: Int){ // 取当前要删除条目的真实文档ID val targetDocId = lists[position].documentId FirestoreClass().deleteBoard(targetDocId) lists.removeAt(position) // 替换notifyDataSetChanged性能更好,还会自带删除动画 notifyItemRemoved(position) }
可选优化建议(建议补充)
你当前的逻辑是不管云端删除结果直接删本地列表,容易出现云端删除失败但本地列表已经消失,下次刷新数据又恢复的异常,建议给删除方法加结果回调:
// 补充回调的deleteBoard方法 fun deleteBoard(documentId: String, onSuccess: ()->Unit, onFail: (Exception)->Unit){ mFireStore.collection(Constants.BOARDS).document(documentId).delete() .addOnSuccessListener { onSuccess() } .addOnFailureListener { e -> onFail(e) } } // 适配器del方法对应调整 fun del(position: Int){ val targetDocId = lists[position].documentId FirestoreClass().deleteBoard(targetDocId, onSuccess = { lists.removeAt(position) notifyItemRemoved(position) }, onFail = { e -> Toast.makeText(context, "删除失败:${e.message}", Toast.LENGTH_SHORT).show() // 删除失败恢复被滑动的条目 notifyItemChanged(position) } ) }
额外检查项
如果修改后依然删除失败,确认你的Cloud Firestore安全规则配置了boards集合的删除权限,没有权限限制也会导致删除操作被拦截。
内容的提问来源于stack exchange,提问作者souryaman singh
相关产品推荐
相关产品推荐

