2017-04-24 10 views
0

Firebaseからデータを取得してから、ArrayListを返したいとします。私はデータベースの変更を常に聞きたいとは思わない。私はちょうどすぐにデータベースを一度クエリしたいので、私はaddListenerForSingleValueEventを使用しています。これは私がデータベースからデータを取得して単純にそれを返すことができると思っていましたが、リストは残念ながら空です。 onDataChangeメソッドの最後にリストを更新しようとしましたが、リストが空であるためにまだ動作しません。Firebaseのデータ返信方法

private List<ContactsDTO> contacts = new ArrayList<>(); 

public void updateContacts(List<ContactsDTO> contacts) { 
    this.contacts = contacts; 
} 

public void getContactsDB() { 

    refContacts.addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      List<ContactsDTO> temp = new ArrayList<>(); 
      for(DataSnapshot child : dataSnapshot.getChildren()) { 
       ContactsDTO contactDTO = child.getValue(ContactsDTO.class); 
       temp.add(contactDTO); 
      } 

      updateContacts(temp); 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 
      System.out.println("error"); 
     } 
    }); 
} 

public List<ContactsDTO> getContacts() { 
    getContactsDB(); 
    System.out.println("contacts size: " + contacts.size()) // list will be empty 
    return contacts; 
} 

//編集:

デシベル構造が問題ではありませんが、あなたが望むように私はOnDataChangeの方法で正しくデータを取得:

enter image description here

をあなたは持っていますどのようにそれを達成するための任意のアイデア?

+0

データベース構造を追加してください –

+0

guiでリストが空であるのか、それともデバッグするのですか? –

+0

私はそれをデバッグし、コンソールのリストサイズを出力するとき。 – scof93

答えて

2

これは、onDataChangeが非同期に呼び出され、onDataChangeが呼び出される前にステートメントreturn contactsが実行されたために発生します。したがって、temp List<ContactsDTO>を使用するには、onDataChange()メソッド内で使用する必要があります。

この問題を解決するには、postpostにアクセスしてください。

希望します。

+0

Thx私はインターフェイスでソリューションを使用しました。 – scof93

+0

それは良いニュースです。これを頭に喜ぶ。乾杯! –

関連する問題