有人可以就这个问题给我建议吗: 我正在尝试从 Firebase DB onCreate 加载一些过滤后的数据,并用数据填充自定义数组。
经过一些调试后,我可以看出数据是从数据库加载的,但我的自定义数组没有填充。
请看下面我的代码。
即使我的 loadAllBooks() 方法正在填充数组,但它完成得太晚了,并且该行:
//3) Create the adapter
BooksAdapter adapter = new BooksAdapter (this, booksList);
在 loadAllBooks() 完成之前执行,这会导致空列表... 就好像我需要某种 onComple 来实现 addChildEventListener...
请帮忙,如果需要更多信息,请告诉我,谢谢:
ArrayList<BookItem> booksList;
ListView listView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//1) empty books list
booksList = new ArrayList<BookItem>();
//2) load all books from firebase DB - into booksList array
loadAllBooks();
//3) Create the adapter
BooksAdapter adapter = new BooksAdapter (this, booksList);
//4) Attach the adapter to a ListView
listView = (ListView) findViewById(R.id.lvBooks);
listView.setAdapter(adapter);
}
public void loadAllBooks() {
Firebase ref = new Firebase(".......firebaseio.com/books");
Query queryRef = ref.orderByChild("bookType").equalTo("drama");
queryRef.addChildEventListener(childEventListener);
}
ChildEventListener childEventListener = new ChildEventListener() {
@Override
public void onChildAdded (DataSnapshot bookNode, String previousChild){
BookItem bookItemModel = bookNode.getValue(BookItem.class);
booksList.add(bookItemModel);
}
public void onChildRemoved(DataSnapshot snapshot) {}
public void onChildChanged(DataSnapshot snapshot, String previousChild){}
public void onChildMoved(DataSnapshot snapshot, String previousChild) {}
@Override
public void onCancelled(FirebaseError firebaseError) {}
};
谢谢!
最佳答案
当您调用 addChildEventListener()
时,Firebase 开始从远程位置异步加载数据。这意味着代码会立即执行,并将一个空列表传递给适配器。稍后,当初始数据从 Firebase 同步后,它就会添加到列表中。但到那时您已经创建了适配器。
通过添加一些日志语句,您可以最轻松地查看流程:
System.out.println("Start loading/synchronizing books");
loadAllBooks();
System.out.println("Creating adapter");
BooksAdapter adapter = new BooksAdapter (this, booksList);
public void onChildAdded (DataSnapshot bookNode, String previousChild){
System.out.println("Adding book to list");
BookItem bookItemModel = bookNode.getValue(BookItem.class);
booksList.add(bookItemModel);
}
这些将按以下顺序打印:
Start loading/synchronizing books
Creating adapter
Adding book to list
Adding book to list
Adding book to list
...
这可能不是您期望的顺序。欢迎来到异步加载 101,它让现代 Web 流行起来,让开发者第一次遇到它时就失去了理智。 :-)
很可能您所需要的只是调用 adapter.notifyDataSetChanged()
来自onChildAdded()
。这通知 Android 适配器中的数据已更改,并且它应该重新绘制关联的 View 。
public void onChildAdded (DataSnapshot bookNode, String previousChild){
BookItem bookItemModel = bookNode.getValue(BookItem.class);
booksList.add(bookItemModel);
adapter.notifyDataSetChanged();
}
请注意,我无法确定这是否有效,因为您的问题中没有包含 BooksAdapter
的代码。
关于java - Firebase (Android) - 将过滤后的数据加载到自定义 ArrayList 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35831006/