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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 07:24:01