我有以下代码:
public synchronized void next(final RoomListQueryResultHandler handler) {
this.setLoading(true);
roomList = new ArrayList<Room>();
this.database.child("members").child(this.mUser.getUid()).child("rooms")
.limitToFirst(this.mLimit)
.startAt(this.currentPage * this.mLimit)
.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
RoomListQuery.this.setLoading(false);
//mListAdapter.setLoading(false);
if (!dataSnapshot.hasChildren()) {
RoomListQuery.this.currentPage--;
}
for (DataSnapshot ds : dataSnapshot.getChildren()) {
Room room = ds.getValue(Room.class);
//roomList.add(Room.upsert(room));
Room.getRoom(room.getId(), new Room.RoomGetHandler() {
@Override
public void onResult(Room room, customException e) {
if (e != null) {
// Error!
e.printStackTrace();
return;
}
roomList.add(room);
}
});
handler.onResult(roomList, (customException) null);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
handler.onResult((List) null, new customException(databaseError.toString()));
}
});
}
}
如果他们看到了,我有两个处理程序,首先我从Firebase中调用一个“房间”列表,然后对于每个处理程序我在其他查询中获取详细信息。
问题是响应是一个空列表,因为函数不等待为房间执行所有查询细节,所以变量roomList总是返回空。
知道我可以实现什么,或者用什么方法来解决它?
非常感谢! 问候。
答案 0 :(得分:1)
根据应用程序的结构方式,您可能希望更改数据库设计,以便不需要为从第一个查询中检索到的每个房间执行其他Firebase查询。
#start bye dear #end
#start my world #end
#start hello there #end
如果您要创建列表视图,其中每行都来自//mListAdapter.setLoading(false);
Firebase节点,那么显示该列表所需的最小房间属性是多少?如果它只是一些东西,如房间名称,照片网址,所有者,room_id等,您可能最好复制原始来源的那些。然后单击其中一行可以触发/members/<user_id>/rooms
中的原始附加 Firebase查询,导航到新屏幕/显示一个模式,其中包含检索后的完整房间详细信息。< / p>
<强>更新强>
为了解决关于需要额外数据的评论,在这种情况下,作为Room.getRoom(room.getId(), new Room.RoomGetHandler() { ... });
类的一部分,我将包括一个额外的布尔值Room
,最初设置为false。因此,为了在列表中呈现房间,当_loadedDetails
当前为假时,只显示加载微调器。这样,您仍然可以执行这些其他查询,完成后,根据索引更新_loadedDetails
内的相应Room
对象。像这样:
roomList