2016-12-29 2 views
0

Я пытаюсь написать приложение firebase, содержащее простой ArrayList, который будет служить в качестве фида для представления списка. Для этого у меня есть синглтон, который заботится о FirebaseConnection и будет извлекать данные. Затем эти данные будут отправлены в список. Проблема состоит в том, что данные сначала подаются в список как null, после чего данные завершаются. Какие-нибудь решения для меня?Возвращение значения в 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

Данные загружаются асинхронно из 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); 
+0

спасибо, что помогает, но так как я получаю данные Firebase в виде SingletonClass, в то время как адаптер в деятельности есть способ, чтобы информировать адаптера без необходимости передавать его как параметр метода (это будет невозможно, так как адаптер еще не установлен во время прохождения метода). Или это плохая практика, чтобы сделать это в классе Singleton? – John

+0

В этом случае вам необходимо передать адаптер и перечислить его в свой метод. Я обновил код в своем ответе. –

+0

благодарю вас за кучу :) работает как шарм – John

Смежные вопросы