2016-12-29 87 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