データはFirebaseから非同期にロードされます。また、私はリストを作成する方法は以下の通りである。
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();
}
});
}
今、あなたのようにそれを呼び出すことができます。アダプタが活動している間、私は、SingletonClassでFirebaseデータを取得しておりますので役立ちますが、おかげで通知する方法がある
ArrayList<Event> events = new ArrayList<Event>();
EventListAdapter adapter = new EventListAdapter(this, eventsArray);
eventsListView.setAdapter(adapter);
FirebaseConnection.getInstance().getAllEventsOnFirebase(adapter, events);
アダプターをメソッド・パラメーターとして渡す必要はありません(アダプターがメソッドを渡すときにまだ設定されていないため、これはできません)。それともシングルトンクラスでやるのが悪い習慣ですか? – John
この場合、アダプタを渡してユーティリティメソッドにリストする必要があります。私は私の答えでコードを更新しました。 –
ありがとうございます:)魅力のように動作します – John