ArrayList Elemente beinhalten nur Daten des letzten Elements?

znieh99

znieh99

Fortgeschrittenes Mitglied
12
Hallo Forum,
ich möchte eine ArrayList mit Elemente füllen. Alle Elemente haben dann aber nur das letzte Element als Inhalt. Es sieht so aus, als ob nur die Referenz des Elements in die ArrayList aufgenommen wird. Wie kann man das lösen?
Code:
    ArrayList<HashMap<String, String>> list = new ArrayList<HashMap<String, String>>();

 private void showList1() {
            // ein Element (item)  der list erstellen
        HashMap<String, String> item = new HashMap<String, String>();

        item.put("name", "Allianz" );
        item.put("beschreibung",  "Versicherung");
        list.add(item);
        item.put("name", "Verbund" );
        item.put("beschreibung",  "Energie0");
        list.add(item);

        SimpleAdapter sa = new SimpleAdapter(this, list, R.layout.list_item,
                new String[] { "name", "beschreibung" }, new int[] {R.id.name, R.id.price });
        final ListView lv = (ListView)findViewById(R.id.list_view);
        lv.setAdapter(sa);
 
Hallo Heinz,
HashMap ist ein wenig "veraltet".

Nimm Dir dazu besser eine ArrayList mit Struktur

Bsp (Eindimensional)
Code:
 ArrayList<String> obj = new ArrayList<String>();

      /*This is how elements should be added to the array list*/
      obj.add("Ajeet");
      obj.add("Harry");
      obj.add("Chaitanya");
      obj.add("Steve");
      obj.add("Anuj");

Für Mehrdimensionale kannst du dir eine HolderKlasse bauen und diese in die ArrayList anstatt String übergeben

Bsp : (Mehrdimensional)
Code:
  public class myStruct
    {
        String val1;
        String val2;
        public void myStruct()
        {
            val1 = "";
            val2 = "";
 
        }
    }

Code:
ArrayList<myStruct> obj = new ArrayList<myStruct>();

myStruct ms;
ms = new myStruct();
ms.val1 = "AVAL1";
ms.val2 = "AVAL2";
obj.add (ms);
ms = new myStruct();
ms.val1 = "BVAL1";
ms.val2 = "BVAL2";
obj.add (ms);

P.S. Für den Listview würde ich direkt einen CustomAdapter (Baseadapter) nehmen, weil ich mal ganz stark
vermute , dass du beide Strings gesondert in einer Row anzeigen möchtest

Hier ein schönes Beispiel mit mehrdimensionaler ArrayList
Using a BaseAdapter with ListView · codepath/android_guides Wiki · GitHub
 
Zuletzt bearbeitet:
  • Danke
Reaktionen: znieh99
@swa00
Danke Stefan, es wird immer heller!
lg heinz
 
  • Danke
Reaktionen: swa00
swa00 schrieb:
Code:
ArrayList<myStruct> obj = new ArrayList<myStruct>();

myStruct ms;
ms = new myStruct();
ms.val1 = "AVAL1";
ms.val2 = "AVAL2";
obj.add (ms);
ms = new myStruct();
ms.val1 = "BVAL1";
ms.val2 = "BVAL2";
obj.add (ms);
P.S. Für den Listview würde ich direkt einen CustomAdapter (Baseadapter) nehmen, weil ich mal ganz stark
vermute , dass du beide Strings gesondert in einer Row anzeigen möchtest

Um das Problem mit den Referenzen zu lösen, musst du, wie swa00 zeigt, jedes mal ein neues Object erstellen und nicht das alte wiederverwenden.

Bei deiner Anwendung würde ich auch eine Holderklasse nutzen. Das vereinfacht vieles.

Nebenbemerkung: Ich denke es ist auch sinnvoll RecyclerView statt ListView zu nutzen. ListView funktioniert auch, aber sollte dein Datensatz groß werden ist RecyclerView wohl besser.
 
  • Danke
Reaktionen: swa00

Ähnliche Themen

L
Antworten
4
Aufrufe
1.316
lonnie9020
L
A
Antworten
10
Aufrufe
1.006
swa00
swa00
A
Antworten
10
Aufrufe
1.867
swa00
swa00
Zurück
Oben Unten