ListView mit Adapter und eigener Datenstruktur

  • ListView ist für Anfänger nicht wirklich einfach - nach vielen Fragen im Forum hab ich nun mal ein Tutorial dazu gemacht. Ich gehe dabei auch auf einige andere Punkte ein, die bei Anfängern gerne mal Probleme bereiten.


    Zunächst mal die grobe Übersicht:
    ListView ist ein vertikal scrollendes Widget, das von einem Adapter die Listeneinträge aufbauen läßt und diese dann anzeigt. Dabei werden nur so viele Einträge erzeugt, bis der Bildschirm voll ist (und noch ein bisschen weiter).
    Wenn der Benutzer dann scrollt, werden vom ListView die benötigten Einträge vom Adapter nachgeladen (das habt ihr bestimmt schon bei einigen Apps bemerkt).


    Es gibt zwar einige spezialisierte Adapter (z.B. ArrayAdapter, CursorAdapter), aber ich nutze hier den BaseAdapter, da sieht man besser, was intern passiert.


    Die Daten verpacke ich in eine Klasse Datensatz, mehrere Datensätze kommen in eine ArrayList<Datensatz>. Diese ArrayList nutzt dann der BaseAdapter mit einem Layout und erzeugt die List-Einträge.


    Nun geht's los:


    Zunächst brauchen wir eine Datenstruktur für die Informationen, die in einem Listeneintrag eingebaut werden ("Datensatz").

    Java
    private class Datensatz {
    	public String name;  // besser setter und getter-Methoden schreiben, stört hier aber...
    	public String datum; // die Umwandlung von Datum lasse ich weg - das ist ein anderes (großes) Problem
    	public Datensatz(String name, String datum) {
    		this.name = name;
    		this.datum = datum;
    	}
    }


    Die Datensätze kommen in eine ArrayList, diese benutzt dann der Adapter, um die einzelnen Views zu erzeugen. Die Variable datensaetze gilt für die ganze Activity:


    Damit ein Datensatz in der Liste als View-Element eingebaut werden kann, brauchst du ein Layout. Ich hab hier mal ein Beispiel mit ein paar nützlichen Formatierungen (speichern in Projekt/res/layout/mylistitemlayout.xml):


    Nun kommt der Adapter, der dem ListView die einzelnen ListItems auf Anfrage liefert. Der Adapter muss auch ein getCount liefern, damit ListView weiß, wann Schluss ist. Außerdem braucht man meistens auch einen OnItemClickListener (dann dürfen die Items aber selber keine OnClickListener implementieren!). Meine Activity heißt übrigens MyListActivity - musst du wahrscheinlich anpassen.


    Jetzt brauchen wir noch ein Layout für die MyListActivity:


    So, nun der krönende Abschluss in MyListActivity: Layout laden, Daten aufbauen, ListView mit dem Adapter verbinden:


    Jetzt hab ich hoffentlich alles zusammen - leider muss man sich das aus verschiedenen Quellen zusammen sammeln und Anfänger haben da manchmal zu viele lose Enden in der Hand. Aber hiermit solltest du klar kommen - Erweiterungsmöglichkeiten sind vor allem in Datensatz und bindView sinnvoll, je nach Quelle der Daten ist initDatensaetze auch einfach anzupassen.


    Fehler und Verbesserungen sind willkommen. :D

    Das Leben kann so hart sein, man muss nur richtig wollen!!!

    4 Mal editiert, zuletzt von Kogoro () aus folgendem Grund: Bedankomat aktiviert

  • Wow, vielen Dank!
    Ich habe den ARtikel jetzt zwar nur gelesen und noch nicht ausprobiert (sei glücklich und froh es hätte schlimmer kommen können und ....), also wenn nicht schief geht freue ich michdarauf das Beispiel als Grundgerüst zu verwenden und aufzubauen. Ich denke mal mit ImageViews z.B. kann man das auch noch erweitern.


    Großes danke an den Autor!


    Gruß
    Oli

  • ist ja schon etwas älter und ein angenehm übersichtliches Beispiel - aber: hat das schonmal jemand so zum Laufen gebracht? Ich bekomme nur ein weißes Fenster angezeigt.


    UweApps: bist du noch aktiv? Würde mich gerne mit dir zu diesem Beispiel austauschen.


    Eine Sache konnte ich gerade lösen:
    Ich hatte eine Reihe "Log.d()" Befehle eingebaut und dabei ist mir aufgefallen, dass die Funktionen getView() und somit auch bindView() jeweils 27 Mal durchlaufen wurden - und das bei nur drei Elementen im nameArray bzw. datumArray... Die Ursache hierfür ist die Verwendung von "wrap_content" im Layout der ListView (xml-Datei). Ich muss zugeben, dass ich die Details, WARUM das so ist, noch nicht genau verstanden habe - aber - Verändern zu "match_parent" hilft.


    Die "Erleuchtung" zu diesem Thema fand ich hier:
    https://www.youtube.com/watch?v=wDBM6wVEO70


    speziell (etwa bei 40:45):
    https://www.youtube.com/watch?v=wDBM6wVEO70&t=2445

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!