android - 在 Firebase onDataChange 中返回一个值

标签 android listview firebase firebase-realtime-database

我正在尝试编写一个 firebase 应用程序,其中包含一个简单的 ArrayList,它将用作 ListView 的提要。 为此,我有一个单例来处理 FirebaseConnection 并将获取数据。然后将此数据提供给列表。问题是数据首先作为 null 提供给列表,然后数据完成检索。您可能对我有什么解决方案吗?

这是我的代码:

public ArrayList< Event > getAllEventsOnFirebase() {
    final ArrayList< Event > events = new ArrayList<Event>();

    DatabaseReference eventsTable = getDatabaseTableWith(Constants.tableEvents);

    eventsTable.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {

            for (DataSnapshot postSnapshot: dataSnapshot.getChildren()) {

                HashMap<String, Object> event = (HashMap<String, Object>) postSnapshot.getValue();

                String eventId = (String) event.get(Constants.taEventUUID);
                String eventName = (String) event.get(Constants.taEventName);
                String eventAddress = (String) event.get(Constants.taEventAddress);


                Event newEvent = new Event(eventId, eventName, eventAddress);

                events.add(newEvent);

            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });

    return events;
}

此外,我填充列表的方式如下:

   eventsArray = FirebaseConnection.getInstance().getAllEventsOnFirebase();

    EventListAdapter adapter = new EventListAdapter(this, eventsArray);
    eventsListView.setAdapter(adapter);

最佳答案

数据从 Firebase 异步加载。幸运的是,您可以随时填充 ArrayList,只要您通过调用 adapter.notifyDataSetChanged() 告诉适配器您更改了它。

public ArrayList< Event > getAllEventsOnFirebase(final EventListAdapter adapter, 
                                                 final ArrayList<Event> events) {
  DatabaseReference eventsTable = getDatabaseTableWith(Constants.tableEvents);
  eventsTable.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for (DataSnapshot postSnapshot: dataSnapshot.getChildren()) {
            String eventId = postSnapshot.child(Constants.taEventUUID).getValue(String.class);
            String eventName = event.child(Constants.taEventName).getValue(String.class);
            String eventAddress = event.child(Constants.taEventAddress).getValue(String.class);

            Event newEvent = new Event(eventId, eventName, eventAddress);

            events.add(newEvent);
        }
        adapter.notifyDataSetChanged();
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {
        throw databaseError.toException();
    }
  });
}

现在你可以称它为:

ArrayList< Event > events = new ArrayList<Event>();
EventListAdapter adapter = new EventListAdapter(this, eventsArray);
eventsListView.setAdapter(adapter);

FirebaseConnection.getInstance().getAllEventsOnFirebase(adapter, events);

关于android - 在 Firebase onDataChange 中返回一个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41372562/

相关文章:

java - Java/Android 的 zxing QR 阅读器库的替代品?

android - Crashlytics 发现无效的 API key - AndroidStudio 构建

java - 在列表中添加新行时 Android 可扩展 ListView 帮助

android - 适配器 getView() 内的 PopupMenu 不起作用

java - android无法在自定义对话框中的 ListView 中使用获取所有编辑文本值

firebase - 为什么我的应用程序在 firebase 抛出异常时停止?

javascript - 当我从 firebaseConfig.js 文件导入 firebase 时会发生什么?

javascript - Firebase:自定义声明要求我的用户注销并登录才能生效?

android - 如何处理多个 NavHosts/NavControllers?

android - 如何修复 Flutter AndroidX 不兼容问题?