2016-08-26 10 views
2

Ich habe versucht, eine Arraylist zu füllen, um eine andere Arraylist zu füllen, aber nachdem die Schleife die Subarraylist der Eltern in der ersten Runde, in der nächsten Runde überschreibt die zuvor hinzugefügte Zeile und dupliziert den Wert der 2. Runde und so weiter; So bekomme ich endlich eine Arraylist mit doppelten Zeilen, die alle die letzte Zeile im Cursor haben. Um zu klären, es gut ... stattWie man eine ArrayList <ArrayList <String>>, die eine andere ArrayList enthält <String>

 [Quote1, Location1] 
     [Quote2, Location2] 
     [Quote3, Location3] 
     [Quote4, Location4] 

etwas wie diese Rückkehr es gibt so etwas wie

 [Quote4, Location4] 
     [Quote4, Location4] 
     [Quote4, Location4] 
     [Quote4, Location4] 

Hier ist mein Code:

public ArrayList<ArrayList<String>> getAllVerses() { 
    ArrayList<ArrayList<String>> allVersesAL = new ArrayList<ArrayList<String>>(); 
    ArrayList<String> subAL = new ArrayList<>(); 
    Cursor allVerse = getAllQuote(); //It's an outsider method 
    allVerse.moveToFirst(); 
    do { 
     //subAL.clear(); 
     subAL.add(allVerse.getString(allVerse.getColumnIndex(VERSE))); 
     subAL.add(allVerse.getString(allVerse.getColumnIndex(LOC_AUTH))); 
     Log.d("Content of subAL", subAL + ""); 
     allVersesAL.add(subAL); 
    } while (allVerse.moveToNext()); 

    for (List<String> li : allVersesAL) { 
     for (String s : li) { 
      Log.d("getAllVerses", "Inside the second for loop..."); 
      Log.d("Testing arraylist...", s + " : "); 
     } 
    } 
    return allVersesAL; 
} 

es die Daten an die Unter zuweist ArrayList von einem Cursor-Objekt. Bitte helfen !!! Ich habe viel Zeit damit verbracht, konnte aber nicht herausfinden, was mit meinem Code nicht stimmt. Segne euch alle!

+1

Sie scheinen viele Referenzen auf die gleiche Liste 'subAl' zu Ihrer einschließenden Liste' allVersesAL' hinzuzufügen. Erstellen Sie stattdessen jedes Mal eine neue innere Liste. – khelwood

+1

Kommentieren Sie diesen Code: '//subAL.clear();' wird wahrscheinlich Ihr Problem gelöst –

+1

@ShaishavJogani Nein, wird es nicht. Wenn er das tut, wird die Liste nur Daten für die letzte Zeile im Cursor enthalten. –

Antwort

3

Wenn Sie in einem List das eigentliche Objekt ein Objekt einfügen in die Liste eingefügt wird. Es wird nicht kopiert. Wenn Sie weitere Operationen für dasselbe Objekt ausführen, wirkt sich dies auf das in der Liste gespeicherte Objekt aus.

Sie müssen ein neues ArrayList-Objekt für jede Iteration der äußeren Schleife Ihres Populationscodes erstellen.

do { 
    //subAL.clear(); 
    subAl = new ArrayList<String>(); 
+0

Vielen Dank !!! Es dauerte mehr als einen halben Tag, um herauszufinden, was passiert ist ... Verrrrrrrry hilfreich – Sammie

1

Verschieben ArrayList<String> subAL = new ArrayList<>(); innerhalb der do while Schleife

+1

Vielen Dank. Es hat sehr geholfen! – Sammie

+0

@Sammie Bitte akzeptieren Sie die Antwort und stimmen Sie ab, wenn es Ihnen geholfen hat. Vielen Dank! –

Verwandte Themen