2016-12-29 3 views
0

私はリストビューのフィードとして機能する単純なArrayListを含むfirebaseアプリケーションを作成しようとしています。 そうするために、私はFirebaseConnectionを処理し、データを取得するシングルトンを持っています。このデータはリストに送られます。問題は、データが最初にヌルとしてリストに送られてから、データの検索が完了したことです。あなたが私のために持っている可能性のあるソリューション?Firebase onDataChangeの値を返す

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

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

答えて

2

データは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); 
+0

アダプターをメソッド・パラメーターとして渡す必要はありません(アダプターがメソッドを渡すときにまだ設定されていないため、これはできません)。それともシングルトンクラスでやるのが悪い習慣ですか? – John

+0

この場合、アダプタを渡してユーティリティメソッドにリストする必要があります。私は私の答えでコードを更新しました。 –

+0

ありがとうございます:)魅力のように動作します – John

関連する問題