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

Android Studio中删除Firebase和RecyclerView数据时应用崩溃如何修复

问题根因

你的崩溃属于数组索引越界错误,核心原因是两个重名变量导致逻辑完全错误:

  • populateViewHolder方法的第三个参数i是列表项的真实位置
  • AlertDialog按钮点击回调的参数也叫i,这个参数实际是Dialog按钮的标识值(确认按钮对应值为-1,取消按钮对应值为-2),完全不是列表的位置索引
  • 你还执行了index = i-1的操作,相当于用-1再减1得到了-2,和崩溃日志里的index=-2完全匹配,直接触发了数组越界。

修复步骤

  1. 在长按事件的最外层先把当前列表项的正确位置存为final变量,避免被内部的重名变量覆盖
  2. 删掉无用的索引减1逻辑,还有重复的删除、重复的列表通知操作,FirebaseRecyclerAdapter会自动监听数据库变化更新列表,不需要手动调用刷新方法。

修复后的长按事件代码如下:

//Hapus file
adminViewHolder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
    @Override
    public boolean onLongClick(View view) {
        // 提前存储当前列表项的正确位置
        final int currentItemPosition = i;
        AlertDialog.Builder builder = new AlertDialog.Builder(AdminStockInActivity.this);
        builder.setTitle("Hapus Barang Ini?");
        builder.setMessage("Data tidak bisa dipulihkan setelah dihapus");

        builder.setPositiveButton("Ya", new DialogInterface.OnClickListener() {
            @Override
            // 修改参数名避免和列表位置重名
            public void onClick(DialogInterface dialogInterface, int which) {
                // 用提前存好的正确位置删除对应数据
                DatabaseAddStock.child(getRef(currentItemPosition).getKey()).removeValue()
                    .addOnSuccessListener(new OnSuccessListener<Void>() {
                        @Override
                        public void onSuccess(Void unused) {
                            Toast.makeText(AdminStockInActivity.this, "数据已删除", Toast.LENGTH_SHORT).show();
                        }
                    })
                    .addOnFailureListener(new OnFailureListener() {
                        @Override
                        public void onFailure(@NonNull Exception e) {
                            Toast.makeText(AdminStockInActivity.this, "数据删除失败,请重试", Toast.LENGTH_SHORT).show();
                        }
                    });
            }
        });

        builder.setNegativeButton("Tidak", new DialogInterface.OnClickListener() {
            @Override
            // 修改参数名避免重名
            public void onClick(DialogInterface dialogInterface, int which) {
                Toast.makeText(AdminStockInActivity.this, "Data tidak jadi dihapus", Toast.LENGTH_SHORT).show();
            }
        });

        builder.show();
        return true;
    }
});

额外说明

你原来的代码里写了两次完全等价的删除操作,只需要保留一次即可。手动调用notifyItemRemoved、notifyDataSetChanged属于多余操作,FirebaseRecyclerAdapter绑定数据库后会自动感知数据变更刷新列表,多余的通知反而可能引发额外的列表异常。

内容的提问来源于stack exchange,提问作者Rifaldi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 03:15:04