데이터 중포 기지에서 비동기 적으로로드됩니다 또한 내가 목록을 채우는 방법은 다음과 같습니다
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);
감사하지만, 어댑터가 활동에있는 동안 내가하는 SingletonClass에서 중포 기지 데이터를 얻고 이후에 통보하는 방법이 어댑터를 메소드 매개 변수로 전달하지 않아도됩니다 (어댑터가 메소드 전달시 설정되지 않았으므로 불가능합니다). 아니면 Singleton Class에서 그렇게하는 나쁜 습관입니까? – John
그런 경우 유틸리티 메소드에 어댑터와 목록을 전달해야합니다. 내 대답에 코드를 업데이트했습니다. –
한 무리 감사드립니다 :) 매력처럼 작동합니다. – John