[英]Android Studio, Firebase - List error
我正在尝试从List获得帖子的作者,但出现错误:
java.lang.ArrayIndexOutOfBoundsException: length=12; index=-1
程序始终为我提供等于-1的索引,这是从中获取错误的代码:
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
if(dataSnapshot.hasChild(mCurrentUser.getUid())){
mDatabasePosts.orderByKey().equalTo(dataSnapshot.getKey()).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if(dataSnapshot.exists()) {
if(mPostModelList.size() == 1) {
mPostModelList.clear();
mAdapter.notifyDataSetChanged();
}else if(mPostModelList.size() > 1){
Post post = dataSnapshot.getValue(Post.class);
//mPostModelList.remove(post);
/* ERROR -----> */ String p = mPostModelList.get(mPostModelList.indexOf(post)).getDesc(); // <----- ERROR
Toast.makeText(mView.getContext(), p, Toast.LENGTH_SHORT).show();
mAdapter.notifyDataSetChanged();
}
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
问题是您在此行中触发查询:
mDatabasePosts.orderByKey().equalTo(dataSnapshot.getKey())...
当您对Firebase数据库执行查询时,可能会有多个结果。 因此,此查询生成的快照包含这些结果的列表。 即使只有一个结果,快照也将包含一个结果的列表。 而且您的听众无法处理它得到列表的事实。
但是在这种情况下,您甚至不需要查询。 第一行等效于:
mDatabasePosts.child(dataSnapshot.getKey())...
这将直接查找子节点,而不是触发查询。 不仅可以保证仅得到一个结果,而且还可以更快(因为服务器不需要对其进行查询)。 第三个优点:传递给回调的dataSnapshot
仅包含单个快照,因此您无需循环。 您当前的代码将正常工作。
如果在列表中找不到post
则mPostModelList.indexOf(post)
将返回-1。
如果确定post对象存在于该列表中并且仍然没有获得正确的索引,则需要在Post类中重写equals()和hashCode()方法,并在其中添加逻辑以确保它相同
例如使用id字段的Sample Post类
public class Post {
public String id;
@Override
public boolean equals(Object obj) {
return super.equals(((Post)obj).id.equals(this.id));
}
@Override
public int hashCode() {
return id.hashCode();
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.