2016-12-29 4 views
0

리스트 뷰의 피드 역할을하는 간단한 ArrayList가 포함 된 firebase 앱을 작성하려고합니다. 이렇게하려면 FirebaseConnection을 처리하고 데이터를 가져 오는 싱글 톤이 있어야합니다. 그런 다음이 데이터가 목록에 공급됩니다. 문제는 데이터가 처음으로 목록에 null로 공급 된 다음 데이터 검색이 완료된 것입니다. 나에게 어떤 해결책이 있을까요?Firebase onDataChange에서 값 반환하기

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

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

답변

2

데이터 중포 기지에서 비동기 적으로로드됩니다 또한 내가 목록을 채우는 방법은 다음과 같습니다

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

:

여기 내 코드입니다. 다행히도 adapter.notifyDataSetChanged()을 호출하여 어댑터를 변경했다는 것을 알리는 한 언제든지 ArrayList을 채울 수 있습니다.

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에서 중포 기지 데이터를 얻고 이후에 통보하는 방법이 어댑터를 메소드 매개 변수로 전달하지 않아도됩니다 (어댑터가 메소드 전달시 설정되지 않았으므로 불가능합니다). 아니면 Singleton Class에서 그렇게하는 나쁜 습관입니까? – John

+0

그런 경우 유틸리티 메소드에 어댑터와 목록을 전달해야합니다. 내 대답에 코드를 업데이트했습니다. –

+0

한 무리 감사드립니다 :) 매력처럼 작동합니다. – John

관련 문제