Android Studio Firebase列表报错:ArrayIndexOutOfBoundsException索引-1问题
解决java.lang.ArrayIndexOutOfBoundsException: index=-1问题
首先咱们直接定位核心问题:你碰到的index=-1错误,是因为mPostModelList.indexOf(post)返回了-1——这说明当前列表里找不到你从Firebase获取到的这个Post对象,后续调用get(-1)自然就触发数组越界异常了。
为什么会找不到?因为List.indexOf()是靠对象的equals()方法判断匹配度的,如果你的Post类没有正确重写equals()和hashCode()方法,哪怕两个Post对象的内容完全一致,Java也会把它们当成不同的对象,自然就找不到匹配项,返回-1了。
具体解决方法
方法一:重写Post类的equals()和hashCode()
用帖子的唯一标识(比如Firebase里的key)来重写这两个方法,让Java能正确识别同一个帖子对象。示例代码如下:
public class Post { // 你的其他字段 private String postKey; // 存储Firebase中该帖子的唯一key // 构造函数、getter、setter方法... @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Post post = (Post) o; return Objects.equals(postKey, post.postKey); } @Override public int hashCode() { return Objects.hash(postKey); } }
这样indexOf()就能正确定位到列表中的对应帖子了。
方法二:直接遍历列表匹配key(更稳妥)
如果你不想修改Post类,也可以直接遍历列表,通过帖子的唯一key找到目标元素,避免依赖equals()方法:
// 替换原来出错的代码段 String targetPostDesc = null; int targetIndex = -1; String targetKey = dataSnapshot.getKey(); // 遍历列表找对应key的帖子 for (int i = 0; i < mPostModelList.size(); i++) { Post currentPost = mPostModelList.get(i); if (targetKey.equals(currentPost.getPostKey())) { // 假设Post有getPostKey()方法 targetIndex = i; targetPostDesc = currentPost.getDesc(); break; } } if (targetIndex != -1) { Toast.makeText(mView.getContext(), targetPostDesc, Toast.LENGTH_SHORT).show(); mPostModelList.remove(targetIndex); // 如果需要移除该帖子 mAdapter.notifyDataSetChanged(); } else { // 可选:没找到时打个日志提示 Log.d("PostRemoval", "帖子key " + targetKey + " 不在列表中"); }
额外注意事项
- 确保
mPostModelList中的每个Post对象都正确保存了Firebase返回的帖子key,不然无论是indexOf()还是遍历都找不到目标。 - 你原来注释掉了
mPostModelList.remove(post);,如果需要移除元素,用索引remove(targetIndex)比直接移除对象更可靠。
内容的提问来源于stack exchange,提问作者Cariweb
相关产品推荐
相关产品推荐

