Android Studio中删除Firebase和RecyclerView数据时应用崩溃如何修复
问题根因
你的崩溃属于数组索引越界错误,核心原因是两个重名变量导致逻辑完全错误:
populateViewHolder方法的第三个参数i是列表项的真实位置- AlertDialog按钮点击回调的参数也叫
i,这个参数实际是Dialog按钮的标识值(确认按钮对应值为-1,取消按钮对应值为-2),完全不是列表的位置索引 - 你还执行了
index = i-1的操作,相当于用-1再减1得到了-2,和崩溃日志里的index=-2完全匹配,直接触发了数组越界。
修复步骤
- 在长按事件的最外层先把当前列表项的正确位置存为final变量,避免被内部的重名变量覆盖
- 删掉无用的索引减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
相关产品推荐
相关产品推荐

