在Firebase onDataChange中返回一个值 [英] Returning a value in Firebase onDataChange

查看:203
本文介绍了在Firebase onDataChange中返回一个值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试编写一个firebase应用程序,其中包含一个简单的ArrayList,它将用作列表视图的提要。
为了做到这一点,我有一个负责FirebaseConnection的单身人士,并将获取数据。这个数据然后被列入清单。问题是数据首先被列为空,然后数据完成检索。任何解决方案,你可能有我?

这是我的代码:

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

DatabaseReference eventsTable = getDatabaseTableWith(Constants.tableEvents);

eventsTable.addListenerForSingleValueEvent(新ValueEventListener(){
@覆盖
公共无效onDataChange(DataSnapshot dataSnapshot){

为(DataSnapshot执行PostSnapshot:dataSnapshot。的getChildren()){

的HashMap<字符串,对象>的事件=(HashMap中<字符串,对象>)postSnapshot.getValue();

字符串EVENTID =(字符串)事件获得(Constants.taEventUUID);
字符串eventName的=(字符串)event.get(Constants.taEventName);
字符串eventAddress =(字符串)event.get(Constants.taEventAddress);


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

events.add(newEvent);

}
}

@Override
public void onCancelled(DatabaseError databaseError){
$ b}
});

返回事件;
}

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

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

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


解决方案

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

  public ArrayList<事件> getAllEventsOnFirebase(final EventListAdapter adapter,
final ArrayList< Event> events){
DatabaseReference eventsTable = getDatabaseTableWith(Constants.tableEvents);
eventsTable.addListenerForSingleValueEvent(新ValueEventListener(){
@覆盖
公共无效onDataChange(DataSnapshot dataSnapshot){
为(DataSnapshot执行PostSnapshot:dataSnapshot.getChildren()){
字符串EVENTID = postSnapshot.child(Constants.taEventUUID).getValue(String.class);
字符串eventName的= event.child(Constants.taEventName).getValue(String.class);
字符串eventAddress = event.child(Constants.taEventAddress).getValue(String.class);

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

events.add(newEvent );
}
adapter.notifyDataSetChanged();
}
$ b @覆盖
public void onCancelled(DatabaseError databaseError){
throw databaseError .toException();
}
});

$ / code>

现在您可以将其称为:

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

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


I am trying to write a firebase app that contains a simple ArrayList that will serve as feed for a list view. In order to do so I have a singleton that takes care of FirebaseConnection and will fetch the data. This data is then feeded to the list. The problem is the data is first feeded to the list as null then the data is finished retrieving. Any solutions you might have for me?

Here is my code:

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;
}

Also the way I populate the list is as follows:

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

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

解决方案

Data is loaded asynchronously from Firebase. Luckily you can populate the ArrayList at any moment, as long as you tell the adapter that you changed it by calling 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();
    }
  });
}

Now you can call it as:

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

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

这篇关于在Firebase onDataChange中返回一个值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆