2017-06-02 94 views
0

我是Android編程新手。我想在Android中列出Firebase中的所有子列表。在android中列出兒童

我寫了這段代碼。但是當我啓動應用程序時,listview返回null。

什麼問題?

public class haber_goruntule extends AppCompatActivity { 
private ListView liste; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_haber_goruntule); 
    final List<connector_haber> mesajlar=new ArrayList<connector_haber>(); 

    liste= (ListView) findViewById(R.id.list); 
    FirebaseDatabase firebaseDatabase=FirebaseDatabase.getInstance(); 
    DatabaseReference ref=firebaseDatabase.getReference(); 

    ref.child("haberler").addValueEventListener(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      Iterable<DataSnapshot> children=dataSnapshot.getChildren(); 
      for(DataSnapshot child : children){ 

      connector_haber haber=child.getValue(connector_haber.class); 
       mesajlar.add(haber); 
      } 


     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 

    final ArrayAdapter<connector_haber> arrayAdapter=new ArrayAdapter<connector_haber>(this,android.R.layout.simple_list_item_1,mesajlar); 
    liste.setAdapter(arrayAdapter); 
    } 
} 
+1

你好@Kevin。請確保您使用調試模式或日誌語句實際接收onDataChange中的數據。另請將'arrayAdapter.notifyDataSetChanged()'調用添加爲onDataChange回調中的最後一行回調 –

+0

您還可以使用子監聽器https://firebase.google.com/docs/reference/android/com/google/firebase/database/ ChildEventListener這種方式你不需要迭代器,但必須添加數據到適配器每次添加 – cutiko

回答

1

數據是從Firebase異步加載的。當它回來時,你將它添加到適配器,但Android不知道這一點。爲了使它意識到,打電話notifyDataSetChanged()您已經添加數據後:

final ArrayAdapter<connector_haber> arrayAdapter=new ArrayAdapter<connector_haber>(this,android.R.layout.simple_list_item_1,mesajlar); 
liste.setAdapter(arrayAdapter); 
ref.child("haberler").addValueEventListener(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 
     Iterable<DataSnapshot> children=dataSnapshot.getChildren(); 
     for(DataSnapshot child : children){ 

      connector_haber haber=child.getValue(connector_haber.class); 
      mesajlar.add(haber); 
     } 
     adapter.notifyDataSetChanged(); // tell the adapter to update the view 

    } 

    @Override 
    public void onCancelled(DatabaseError databaseError) { 
     throw databaseError.toException(); // don't ignore this error 
    } 
}); 
+0

謝謝弗蘭克我添加了adapter.notifyDataSetChanged()。但它仍然沒有顯示任何東西。我的數據庫「haberler」有subchildren,它有自己的keys.Do你認爲我用正確的方式列出數據庫列表視圖? – Kevin

+0

我很難從這裏看到。但是你可以在調試器中遍歷你的'onDataChange()'方法,看看'haber'是否有你期望的值。如果不是這樣,你的'connector_haber'類可能與你的JSON模型不匹配(這對我來說似乎是一個單獨的問題)。 –

0

以及..有與火力點實施UI開源庫。試試這個FirebaseUI

+0

雖然這絕對是一種有效的方法,但構建自定義適配器也是有效的。事實上,這幾乎就是FirebaseUI的開始:幾年後構建自定義適配器後,我們意識到將它們放入可重用的庫中可能很有用。 –

+0

Ohhooo ..男人@Frank你真棒..我見過你的個人資料!我非常感動! hatz off – MrCurious

1

試試這個:

ref.child("haberler").addValueEventListener(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 
     Iterable<DataSnapshot> children=dataSnapshot.getChildren(); 
     for(DataSnapshot child : children){ 

      connector_haber haber=child.getValue(connector_haber.class); 
      mesajlar.add(haber); 
     } 
     final ArrayAdapter<connector_haber> arrayAdapter=new ArrayAdapter<connector_haber>(this,android.R.layout.simple_list_item_1,mesajlar); 
     liste.setAdapter(arrayAdapter); 

    } 

    @Override 
    public void onCancelled(DatabaseError databaseError) { 
     throw databaseError.toException(); // don't ignore this error 
    } 
}); 
+0

@Kevin檢查這個 –