Hallo zusammen,
wie kann ich ein ListView "dynamisch nachladen"?
D.h. sobald ich ans Ende gescrollt habe, sollen praktisch weitere Datensätze drangehängt werden.
Grüße, R2
Hallo zusammen,
wie kann ich ein ListView "dynamisch nachladen"?
D.h. sobald ich ans Ende gescrollt habe, sollen praktisch weitere Datensätze drangehängt werden.
Grüße, R2
Dafür gibt's beim ListView den BaseAdapter und ein paar weitere Adapter - du findest ein kurzes Beispiel in den API-Demos.
Zusatzinfo: da du wahrscheinlich mit einem XML-Layout arbeitest, brauchst du myListView.setAdaper(myListAdaper);
Dieser ListAdapter liefert immer einen fertigen Listeneintrag und der ListView ruft sich die Einträge, die er gerade braucht.
Sollte sich aus irgendwelchen Gründen an den Daten, die der Adapter nutzt, etwas ändern (z.B. Eintrag gelöscht), dann musst du den Adapter mit notifyDataSetChanged() darüber informieren.
Die Liste wird aus einem Array generiert (das ich übers Netzwerk abrufe)
ListView l = (ListView) findViewById(R.id.listView1);
l.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, Liste[1]));
und damit nicht alle Daten auf einmal abgerufen werden müssen, will ich nur ein paar laden und bei Bedarf dann mehr.
Wenn du dir einen Adapter selber baust (siehe API-Demo), kannst du dir mit Log.v im Adapter die erzeugten Einträge ausgeben lassen - er macht tatsächlich nur die, die der ListView gerade mal wieder braucht. Ich denke mal, der ListView holt sich erst mal die Gesamtzahl und dann so viele Views aus dem Adapter, bis er den Bildschirm voll hat. Beim Verschieben werden dann weitere geholt. Übrigens auch welche, die er schon mal hatte, wenn sie zwischendurch mal vom Schirm verschwunden sind. Das Verhalten sieht man sehr schön bei Apps, die Daten für Listeneinträge dynamisch aus dem Internet nachladen - das dauert ja etwas.
Wenn du nur ein Array benutzt, dann könntest du so was machen, aber dynamischer wirst du mit:
myItemAdapter = new MyItemAdapter();
myListView = (ListView) findViewById(R.id.myListView);
myListView.setAdapter(myItemAdapter);
Wenn du dann noch myItemAdapter und myListView als private Membervariable der Activity deklarierst, kannst du sie in onResume() etc. auch verwenden - dort wirst du notifyDataSetChanged() wahrscheinlich einbauen.
Dann brauchst du natürlich auch eine Datenstruktur, die der Adapter nutzt - beim Array (feste Länge) ist das eher langweilig, eine ArrayList o.ä. gibt dir mehr Flexibilität.
Und das Layout mit simple_list_item_1 ist ja nur für einfache Sachen - schau dir noch mal den Inflater im API-Demo an, der kann auch deine XML-Layouts verwursten und du kannst hübsche Listeneinträge mit bunten Bildchen und putzigen Schriftarten in deine Liste einfüllen lassen.
Entweder verstehe ich das nicht ganz, oder das funktioniert so nicht.
Ich erkläre meine Situation mal genauer.
Ich bekomme als Antwort auf eine HTTP Anfrage die Einträge für die Liste (ich kann angeben, wie viele).
Zuerst möchte ich nur beispielsweise 20 Stück abrufen und anzeigen. Sobald der Benutzer aber bis ans Ende der Liste gescrollt hat, soll wieder eine HTTP Anfrage gemacht werden, die die nächsten 20 Einträge abruft und dann an die Liste anhängt.
Ich hatte den Eintrag noch ergänzt - der erste Absatz beschreibt am Ende jetzt deine Anwendung.
Du kannst zwar die Daten blockweise laden, das ist aber nicht wirklich praktisch. Dann musst du nämlich immer selber entscheiden, was und wo du gerade bist...
Entweder die Datensätze einzeln laden oder alles auf einmal - wenn du alte Einträge lokal speicherst, brauchst du sie ja nicht unbedingt noch mal laden, aber das entscheidet am besten ein selbstgebauter Adapter.
Der Adapter muss aber schon am Anfang wissen, wieviel kommt, sonst halt notifyDataSetChanged() aufrufen, wenn sich die Anzahl ändert.
Hab noch was gefunden für dich: XML-Adapter.
Die PhotoListActivity und RSSReaderActivity könnten dir weitere Anregungen geben. Dort wird nämlich teilweise nachgeladen...
Puuh, weißt du was, ich glaube es ist tatsächlich einfacher, wenn ich direkt alles auf einmal lade und dann cache.
Danke für die Hilfe
das mache ich auch so - in einer App sogar bei Datenbankzugriffen, aber nicht weitersagen...
Eine kurze Frage hätte ich noch.
Wenn ich die Liste zum ersten mal lade, dauert es etwas.
Wie kann ich so ein Lade"rad", wie es zB. Flash Videoplayer beim buffern verwenden, einbauen?
Du suchst den ProgressBar - wahrscheinlich in der Variante Widget.ProgressBar.Large.
Der ist sogar in der grafischen Layout-Einrichtung vorhanden.
Progressbar ist vermutlich falsch. Ich weiß ja nicht, wie weit es fortgeschritten ist oder wie lange es noch dauert.
Es soll einfach zeigen, dass das Programm gerade lädt.
ProgressDialog dialog = ProgressDialog.show(this, "Loading", "Please wait...", true);
Sieht gut aus. Funktioniert aber nicht richtig. Seltsamerweise taucht der Dialog erst auf, wenn alles fertig geladen hat, obwohl er im Code früher steht.
Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!