Android ArrayList of String objects size 保持为 0 尽管添加了它

Android ArrayList of String objects size remains at 0 despite adding to it

我创建了一个名为 Song 的自定义 class,其中包含 3 个 String 变量、一个 int 变量和一个 ArrayListString ] 项目。

现在我对所有变量都有正确的 getter 和 setter 等等,但问题是,当我为 ArrayList 变量赋值并稍后尝试访问它时,它会抛出一个 IndexOutOfBounds 错误,因为它的大小为 0。下面是有问题的代码。

是否可能是我没有正确分配变量,或者它的内存位置可能因清除它而受到影响?

重要说明:我能够访问和打印其他变量的值,但 ArrayList 变量是唯一失败的变量。


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);
    ...
 }

您的评论是正确的。因为你传递给 song 的 ArrayList 和你调用 clear()ArrayList 是同一个对象,它们都被清除了。

如果你需要清除 ArrayList 传递一个新的 ArrayList 到复制 verses.

内容的 Song 构造函数
songs.add(new Song(String var1, String var2, String var3, int var4, new ArrayList(verses));

此外,请注意 java 中的数组和列表从索引 0 开始,因此您也应该修复 for 循环。

// 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);
    ...
 }

问题是您在 ArrayList 引用中调用了 clear。 当您调用 songs.add 并将经文传递给它并清除它时,您正在清理引用。

您必须实例化要传递给 songs.add 的数组,如下所示:

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

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

由于这行代码,您得到的数组列表大小为 0。

请记住,调用 private ArrayList<String> verses = new ArrayList<>(10); 不会创建包含 10 个新 "empty" 项的 ArrayList。它只是设置列表的最大容量。因此,如果您尝试访问任何项目,您将不会获得空值或任何类型的空值,因为您实际上并未向列表中添加任何内容。您刚刚确保它为 10 个项目预留了内存。因此,在此列表上调用 ArrayList.size() 将正确地返回零项。

因为当你声明

时你声明的versesArrayList是空的
private ArrayList<String> verses = new ArrayList<>(10); 

通过 new ArrayList<>(10);,您并不是在创建一个包含 10 个元素的新 ArrayList,而不仅仅是定义一个初始容量。所以你的 verses 是空的 verses.size() 是 0.

即使你不调用 verses.clear(); 仍然是空的。

再举例说明一下

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'