我目前正在开发一个处理存储图书翻译的Android应用程序。我正在使用Firebase将所有数据保持在线状态,并且无需从数据中提取数据并将其存储为Book对象。我在主类中有一个主要的书籍列表,用于存储Firebase数据库中的所有书籍,但该列表似乎没有正确更新。将Firebase数据保存到列表中
public static List<Book> books = new ArrayList<Book>();
protected void onCreate(Bundle savedInstanceState) {
myFirebaseRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot snapshot) {
for (DataSnapshot bookSnapshhot : snapshot.getChildren()) {
Book book = bookSnapshhot.getValue(Book.class);
books.add(book);
System.out.println(book.getAuthor() + " - " + book.getTitle());
for (Chapter chapter : book.getChapters()) {
System.out.println(chapter.getTitle());
}
for (Genre genre : book.getGenres()) {
System.out.println(genre.getGenre());
}
System.out.println(books.size());
}
}
@Override public void onCancelled(FirebaseError error) { }
});
System.out.println(books.size());
}
在该机构中,书籍的大小是正确的(现在它仅仅是1)。但是,如果我在该代码体(最后一行)之外调用相同的print语句,它会给出0。我不知道为什么,因为它成功将它添加到onDataChange()方法中,但它似乎不适用更改在外面。
Shadab的回答解释说:你现在还不能返回尚未加载的东西。您可能也想在这里阅读我的答案:http://stackoverflow.com/questions/33203379/setting-singleton-property-value-in-firebase-listener。它用几个词来解释它(虽然在不同的上下文中:写数据)。 –