java - Firebase (Android) - 将过滤后的数据加载到自定义 ArrayList 中

标签 java android firebase

有人可以就这个问题给我建议吗: 我正在尝试从 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/

相关文章:

java - 在自定义 Java 组件上正确查找帧速率

javax.el.PropertyNotFoundException : Property 'tname' not found on type java. lang.String

android - 清除 Activity 历史堆栈

java - 为什么会出现 "java.lang.IllegalArgumentException"错误?

javascript - "then"在 firebase 中循环完成之前执行

javascript - 获取推送后创建的对象的 key (Angular 和 Firebase)

Java 循环困惑

android - Gzip 解压缩时内存不足

javascript - 在 Firebase 中过滤数据

java - Spring Config 服务器在运行时添加属性