Eigener Adapter für Liste

  • Hallo zusammen,


    ich erzeuge die Einträge für eine Liste wie folgt:


    Java
    ListView l = (ListView) findViewById(R.id.listView1);
    l.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, nameArray));


    Jetzt möchte ich zusätzlich zu den Namen, die im nameArray gespeichert sind, jeweils das Datum klein darunter anzeigen.


    So wie ich das verstanden habe, brauche ich jetzt ein eigenes Layout für die Zeilen. Das habe ich schon gebastelt, ist ja nicht schwer.


    Ich kriege es aber nicht hin, einen Adapter zu schreiben, der das nameArray und dateArray als Parameter bekommt und passend in die einzelnen Zeilen der Liste schiebt.
    Von welcher Adapterklasse erbe ich am besten? Wie sieht dann das weitere Vorgehen aus?


    Grüße, R2

  • Wenn du nur zwei Zeilen brauchst, gibt's auch eine fertige Vorlage von Android, aber da du schon ein eigenes Layout hast, hier mal ein paar Code-Schnipsel für dich.


    Zunächst brauchst du eine Datenstruktur für die Sachen, die du jeweils einbauen willst ("Datensatz"). Du kannst dir dafür entweder eine eigene Klasse bauen oder HashMap<String, String> benutzen, die ist zwar nicht so gut an deine Daten angepaßt, ist aber manchmal flexibler...
    Dein Vorschlag mit zwei Arrays geht zwar auch, finde ich aber nicht so gut, weil eine eigene Klasse für jeden einzelnen Datensatz dann doch etwas intelligenter aussieht. 8)

    Java
    private class Datensatz {
    	public String name;  // besser private und getter-Methoden schreiben, stört hier aber...
    	public String datum; // die Umwandlung von Datum lasse ich weg - frag das noch mal extra. ;)
    	public Datensatz(String name, String datum) {
    		this.name = name;
    		this.datum = datum;
    	}
    }


    Die Datensätze packst du dann in eine ArrayList, diese benutzt dann der Adapter, um die einzelnen Views zu erzeugen (vor Erzeugung des Adapters aufrufen - siehe unten):

    Java
    private ArrayList<Datensatz> datensaetze;
    private void initDatensaetze() {
    	datensaetze = new ArrayList<Datensatz>();
    	for (int i=0; i<nameArray.length; i++) {
    		datensaetze.add(new Datensatz(nameArray[i],datumArray[i]));
    	}
    }


    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!)


    So, nun der krönende Abschluss: einbinden in deinen ListView:

    Java
    ListView l = (ListView) findViewById(R.id.listView1);
    initDatensaetze();
    MyItemAdapter myAdapter = new MyItemAdapter();
    l.setAdapter(myAdapter);
    l.setOnItemClickListener(myAdapter);


    so, jetzt hab ich glaub ich 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 schon mal klar kommen - Erweiterungsmöglichkeiten sind vor allem in Datensatz und bindView sinnvoll, je nach Quelle der Daten ist initDatensaetze auch einfach anzupassen.


    Fehler und Verbesserungsvorschläge willkommen, dann kommt dies Ding auch in die Tutorials. :D

  • Da man im Grunde nicht immer das Rad neu erfinden muss, gibt es auch ein paar mehr Adaptertypen und du musst nicht zwangsläufig vom BaseAdapter ableiten.
    Wenn deine Daten eh schon in einer Arraylist stehen dann mach dir das Leben einfacher.


    Linkeintrag ist im meinem Fall eine Datenstruktur ähnlich wie sie Uwe als Datensatz umschreibt


Jetzt mitmachen!

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