2016-04-11 9 views
2

ich eine benutzerdefinierte Klasse erstellt haben Song genannt, die 3 String Variablen enthält, eine int Variable und eine ArrayList von String Artikel.Android Arraylist von String-Objekte Größe bei 0 bleibt trotz ihm hinzufügen

Jetzt habe ich die richtigen Getters und Setter für alle Variablen und solche, aber das Problem ist, dass, wenn ich etwas der ArrayList Variable zuweisen und versuchen, später darauf zuzugreifen, wirft es einen IndexOutOfBounds Fehler wegen der Größe von es ist 0. Unten ist der Code in Frage.

Ist es möglich, dass ich die Variable nicht richtig zuweisst oder möglicherweise ihren Speicherort durch das Löschen verändert?

Wichtiger Hinweis: Ich kann auf die Werte der anderen Variablen zugreifen und sie drucken, aber die ArrayList Variable ist die einzige, die fehlschlägt.


SongClass.java

@Parcel 
public class SongClass { 
    //Other variables defined here 
    ArrayList <String> verses; 

    public Song() { /*Required empty bean constructor*/ } 

    public Song(String var1, String var2, String var3, int var4, ArrayList<String> verses) 
    { 
     this.var1= var1; 
     this.var2= var2; 
     this.var3= var3; 
     this.var4= var4; 
     this.verses = verses; 
    } 

    //Getters and Setters below 

SongReader.java

//Use to store a collection of Song objects (multiple songs) 
private ArrayList<Song> songs = new ArrayList<>(10); 

//This array will be assigned to the Song object -> verses 
private ArrayList<String> verses = new ArrayList<>(10); 
//Other vars to be assigned to song object (String, String, String, int) 

... 

songs.add(new Song(String var1, String var2, String var3, int var4, verses); 

//Important note: I clear the verses `ArrayList` after assigning it to songs. Could this possibly erase it from songs? 
verses.clear(); 

SongDisplay.java

ArrayList<Songs> songs = Parcels.unwrap(intent.getParcelableExtra("Extras")); 

... 

for (int i = 1; i <= songs.get(0).size(); ++i) 
{ 
    TextView textView = new TextView(this); 
    ... 
    //Error is thrown here 
    textView.setText(songs.get(0).getVerses().get(i-1); 
    ... 
} 

Antwort

2

Ihr Kommentar ist richtig. Seit dem ArrayList gehen Sie zum Lied und der ArrayList Sie rufen clear() auf sind das gleiche Objekt, das sie beide gelöscht werden.

Wenn Sie die ArrayList löschen müssen passieren ein neues ArrayList in den Song Konstruktor, kopiert den Inhalt von verses.

songs.add(new Song(String var1, String var2, String var3, int var4, new ArrayList(verses)); 

Beachten Sie auch, dass Arrays und Listen in Java-Start bei Index 0, so sollten Sie die for-Schleife zu beheben.

// hard coding songs.get(0) could lead to issues as well but at least fix the index i 
for (int i = 0; i < songs.get(0).size(); i++) 
{ 
    TextView textView = new TextView(this); 
    ... 
    //Error is thrown here 
    textView.setText(songs.get(0).getVerses().get(i); 
    ... 
} 
+0

Ich wusste es: D Ich bin immer noch etwas Neues zu Android Entwicklung, damit ich, wenn die klare Methode es nicht sicher war, beeinflussen würde, selbst wenn es zu einem anderen übergeben wurde Klasse. –

+0

Oh, und in Bezug auf deinen letzten Schnitt, hatte ich tatsächlich 'get (i-1)' anstelle von 'get (i)', aktualisiere Frage. –

+0

Verstanden. Es ist jedoch viel klarer, i bei 0 zu starten, anstatt "i - 1" zu haben. Andere werden verwirrt sein, wenn Sie das tun, wenn sie Ihren Code lesen, und Sie könnten sich später sogar verwirren;). –

1

Das Problem ist, dass Sie in Ihrer ArrayList-Referenz klar aufrufen. Wenn Sie songs.add aufrufen und Verse dazugeben und löschen, bereinigen Sie die Referenz.

Sie haben die Array instanziiert, die Sie vorbei wie unten an songs.add:

ArrayList<String> auxVerses = new ArrayList<>(verses); 

songs.add(new Song(String var1, String var2, String var3, int var4, auxVerses); 
0
verses.clear(); 

Aufgrund dieser Codezeile Sie Array-Liste Größe 0.

0

Halten Sie bekommen Beachten Sie, dass beim Aufruf von private ArrayList<String> verses = new ArrayList<>(10); keine ArrayList mit 10 neuen "leeren" Elementen erstellt wird. Es legt einfach die maximale Kapazität der Liste fest. Wenn Sie also versuchen, auf eines der Elemente zuzugreifen, erhalten Sie keinen Nullwert oder einen leeren Wert, da Sie der Liste nichts hinzugefügt haben. Sie haben nur sichergestellt, dass der Speicher für 10 Elemente reserviert ist. Wenn Sie also auf dieser Liste ArrayList.size() aufrufen, werden Null-Objekte korrekt zurückgemeldet.

+2

Ja, ich bin mir dessen bewusst. Ich habe alle hinzugefügt, aber danke für die Erinnerung. –

1

Weil Ihr erklärt verses Arraylist ist leer, wenn Sie Ihre Aussage

private ArrayList<String> verses = new ArrayList<>(10); 

von new ArrayList<>(10); Sie sind kein neues Arraylist mit 10 Elementen und nicht nur zu definieren, eine Anfangskapazität zu schaffen. So ist Ihre verses leer mit verses.size() ist 0.

Auch wenn Sie nicht anrufen verses.clear(); immer noch leer.

Ein weiteres Beispiel deutlich zu machen,

List<String> list = new ArrayList<String>(10); 
System.out.println(list.size());// print '0' 
list.add("A"); 
System.out.println(list.size());// print '1' 
list.clear(); 
System.out.println(list.size());// print '0'