使用AlertDialog删除RecyclerView中Firebase条目时出现404错误如何解决
问题根因
你的代码逻辑顺序完全错误:触发删除点击后,先直接调用了Firebase Storage的删除接口把云端图片删掉了,之后才弹出确认弹窗。
- 点击弹窗「No」选项时,仅关闭了弹窗没有删除数据库记录,本地列表还保留这条数据,但存储中的图片已经被删除
- 下次再点击同一条目执行删除操作时,再次调用存储删除接口就会找不到对应对象,抛出-13010的404错误
修复方案
调整逻辑顺序:先弹出确认弹窗,用户点击「Yes」之后,再依次执行删除存储文件、删除数据库记录、刷新列表的操作,修复后的代码如下:
@Override public void onDeleteClick(int position) { // 第一步先弹出确认弹窗 View view = LayoutInflater.from(ShowPatientsRecords.this).inflate(R.layout.alertdelete, null); Button no = view.findViewById(R.id.dltNo); Button yes = view.findViewById(R.id.dltYes); AlertDialog dialog = new AlertDialog.Builder(ShowPatientsRecords.this).setView(view).create(); dialog.setCancelable(false); dialog.show(); // 只有用户点击确认才执行删除逻辑 yes.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Upload selectedItem = mUploads.get(position); // 先删除存储中的图片 StorageReference imageRef = mStorage.getReferenceFromUrl(selectedItem.getmImageUrl()); imageRef.delete().addOnSuccessListener(new OnSuccessListener<Void>() { @Override public void onSuccess(Void aVoid) { // 存储删除成功后再删除数据库记录 final String selectedKey = selectedItem.getmKey(); mDatabaseRef.child(selectedKey).removeValue(); // 同步更新本地列表+刷新RecyclerView,避免索引错位 mUploads.remove(position); // 此处替换为你自己的适配器实例名称 yourAdapter.notifyItemRemoved(position); Toast.makeText(ShowPatientsRecords.this, "Record deleted", Toast.LENGTH_LONG).show(); dialog.dismiss(); } }).addOnFailureListener(e -> { // 可根据需要添加删除失败的提示逻辑 Toast.makeText(ShowPatientsRecords.this, "删除失败:" + e.getMessage(), Toast.LENGTH_SHORT).show(); dialog.dismiss(); }); } }); no.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { dialog.dismiss(); } }); }
额外说明
如果你给数据库配置了实时更新监听(比如addValueEventListener),数据库记录删除后会自动回调更新本地mUploads列表,那可以不用手动执行remove+notify操作,两种实现方式选一种即可,避免重复刷新列表。
内容的提问来源于stack exchange,提问作者The Ark D
相关产品推荐
相关产品推荐

