Problem Firebase Daten Laden und in ListView darstellen

  • 2 Antworten
  • Neuster Beitrag
T

timmi0701

Neues Mitglied
Threadstarter
Hallo,

meine App oder mein Code soll Daten aus der Firebase Datenbank auslesen
und zwar diese:
FirebaseDatenAuslesen.JPG


Ich möchte diese Knoten aus der Datenbank auslesen, in eine ArrayList speichern (weil dynamisch) und sie anschließend mit einer ListView ausgeben. Kurz gesagt eine KarteiKarten App bauen.

Ich habe bemerkt, dass die Daten durch den Befehl Log.i(...) nicht angezeigt werden, deswegen fing ich an, die über ein Toast auszugeben, was funktioniert.
Mein Problem ist es, das die Daten aus der Datenbank wahrscheinlich nicht in die ArrayList list eingespeichert werden, deswegen habe ich ein String Array geschrieben, mit diesen String Array lässt sich eine ListView anzeigen.
:(

Wenn ich aber die ListView mit meiner ArrayList ausgeben möchte, bricht die App ab und es kommt zu einem Fehler (Zeile 31, 32).
?(


Habt Ihr eine Idee? Könnt Ihr mir helfen?
O:-)



Code:
public class CardsActivity extends AppCompatActivity {

    ArrayList<String> list;
    ListView lv;
    ArrayAdapter<String> arrayAdapter;
    int id;

    public static final String[] model = {
            "Lektion 1",
            "Lektion 2",
            "Lektion 3",
            "Lektion 4",
            "Lektion 5",
            "Lektion 6",
            "Lektion 7",
            "Lektion 8",
            "Lektion 9",
            "Lektion 10"
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_cards);

        readData();


        list = new ArrayList<String>();
        lv = (ListView) findViewById(R.id.list_view);
        lv.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1 , model));
        //arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,list);
        //lv.setAdapter(arrayAdapter);



    }

    public void readData(){
        FirebaseDatabase db = FirebaseDatabase.getInstance();
        DatabaseReference ref = db.getReference();

        ref.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                for(DataSnapshot childDataSnapshot : dataSnapshot.getChildren()){
                    String var = (String) childDataSnapshot.getKey();
                    list.add((String) var);
                    Log.i("DataValue", childDataSnapshot.getKey());
                    Log.i("DataVar", var);
                    //Toast.makeText(CardsActivity.this, "Var: "+var, Toast.LENGTH_SHORT).show();
                }
                //lv.setAdapter(arrayAdapter);
                //arrayAdapter.notifyDataSetChanged();
                for(int i=0; i<list.size();i++){
                    Toast.makeText(CardsActivity.this, "Var: "+list.get(i), Toast.LENGTH_SHORT).show();
                    model[i] = list.get(i);
                }
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {
                Log.e("The read failed: " ,databaseError.getMessage());
            }
        });

        for(int i = 0; i < list.size(); i++){
            Log.d("DatabaseList", list.get(i).toString());
        }

        int size = list.size();
        Log.d("DatabaseLSize", String.valueOf(size));
    }
 
swa00

swa00

Moderator
Teammitglied
Hallo Timmi,

bitte sei so lieb und stelle erst mal deinen ErrorLog ein.
Deine erwähnten Zeilen 31/32 kann man nicht so ersehen.

Ich sehe auch kein invalidate auf deine ArrayList nach dem Einlesen.
Lies diese einmal komplett ein und debugge mit Breakpoint am Ende den Inhalt deines Arrays

P.S zu deinem Log.i/d : Warum verwendest du denn verschiedene Tags ?
 
J

jogimuc

Erfahrenes Mitglied
Hallo
Was mir gleich auffällt ist das du überhaupt gar keinen Bezug zu deiner DB hast .
Damit meine ich entweder die Reverenz oder das Child.

Schaue dir mal an wie du den Listner in Firebase setzen musst um auch auf deine Daten zuzugreifen.

Retrieving Data | Firebase Realtime Database
Read and Write Data on Android | Firebase Realtime Database


was soll das eigentlich mit der liste model ?
Ich glaube du hast hier zwei Codebeispiel aus dem Netz zusammen gewürfelt.


Außerdem ist es so das der Listner nur ausgeführt wird wenn sich die Daten in der DB ändern

Wenn du deine liste model mit den Daten aus der DB füllen willst und auch in der Listview anzeigen musst du auch den arrayAdapter in dem EventListner setzen und nicht außerhalb.
Bzw schon vorher.
Denn die Daten sind bestimmt langsamer da als du zu dieser Zeile kommst.

lv.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1 , model));

Frage was bekommst du den in der variablen „var“? Sicher nur den Key „karteikarte-f6c63“

Wenn du die anderen Daten haben willst musst du deine Referenz oder Child richtig setzen.
Beitrag automatisch zusammengefügt:

Zweiter Fehler deine Array model ist final somit kannst du das auch nicht in dem Eventlistner ändern.
Warum ist der auch noch static?
Eigentlich solltest du dafür auch kein statisches Array benutzen sonder eine Liste.

Dafür braust du aber einen anderen Adapter. deshalb geht auch deine zweite Zeile nr 32 nicht.
Denn da wist du einem ArrayAdaper eine Liste übergeben was natürlich falsch ist.
 
Zuletzt bearbeitet:
Oben Unten