2017-06-02 4 views
0

Ich bin neu in Android-Programmierung. Ich möchte alle Kinderlisten von Firebase in Android auflisten.Liste Kinder in Android

Ich habe diesen Code geschrieben. Aber wenn ich die Anwendung starte, gibt die ListView null zurück.

Was mache ich falsch?

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

Hallo @ Kevin. Bitte stellen Sie sicher, dass Sie die Daten in onDataChange im Debug-Modus oder mit Log-Anweisungen erhalten. Bitte fügen Sie auch 'arrayAdapter.notifyDataSetChanged()' Anruf als letzte Zeile in OnDataChange Callback –

+0

können Sie auch Child-Listener https://firebase.google.com/docs/reference/android/com/google/firebase/database/ ChildEventListener auf diese Weise brauchen Sie nicht den Iterator, aber müssen die Daten zum Adapter jedes Mal hinzugefügt werden – cutiko

Antwort

1

Die Daten werden asynchron aus Firebase geladen. Wenn es zurückkommt, fügen Sie es dem Adapter hinzu, aber Android ist sich dessen nicht mehr bewusst. Um es bewusst zu machen, notifyDataSetChanged() nennen, nachdem Sie die Daten hinzugefügt haben:

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

Danke Frank Ich habe adapter.notifyDataSetChanged() hinzugefügt. Aber es zeigt immer noch nichts. Meine Datenbank "haberler" hat Unterkinder mit eigenen Schlüsseln. Denken Sie, dass ich den richtigen Weg nenne, um die Datenbank in einer Listenansicht aufzulisten? – Kevin

+0

Das ist schwer für mich von hier aus zu sehen. Aber Sie können Ihre 'onDataChange()' Methode in einem Debugger durchlaufen und sehen, ob 'haber' die Werte hat, die Sie erwarten. Wenn nicht, ist es wahrscheinlich, dass Ihre 'connector_haber'-Klasse nicht mit Ihrem JSON-Modell übereinstimmt (was für mich eine separate Frage zu sein scheint). –

0

gut .. gibt es eine Open-Source-Bibliothek für UI mit Feuerbasis zu implementieren. Versuchen Sie dieses FirebaseUI

+0

Obwohl dies definitiv ein gültiger Ansatz ist, ist es auch möglich, einen benutzerdefinierten Adapter zu erstellen. In der Tat hat FirebaseUI so ziemlich begonnen: Nachdem wir einige Jahre lang benutzerdefinierte Adapter entwickelt hatten, wurde uns klar, dass es nützlich sein könnte, sie in eine wiederverwendbare Bibliothek zu legen. –

+0

Ohhooo .. man @Frank du bist fantastisch .. Ich habe dein Profil gesehen! Ich bin sehr beeindruckt !! Hatz aus – MrCurious

1

Try this:

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 überprüfen Sie dies –

Verwandte Themen