2016-12-29 75 views
0

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

这里是我的代码:

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

回答

2

数据从火力地堡异步加载。幸运的是,您可以随时填写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); 
+0

感谢帮助,但因为我得到的SingletonClass的火力地堡数据,而适配器的活动是有通知的方式而不必将其作为方法参数传递(由于在传递方法时尚未设置适配器,因此这是不可能的)。或者,这是不好的做法,在单身人士班呢? – John

+0

在这种情况下,您需要将适配器和列表传递给您的实用程序方法。我在我的答案中更新了代码。 –

+0

谢谢你一堆:)作品像一个魅力 – John