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
变量和一个 ArrayList
的 String
] 项目。
现在我对所有变量都有正确的 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()
将正确地返回零项。
因为当你声明
时你声明的verses
ArrayList是空的
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'
我创建了一个名为 Song
的自定义 class,其中包含 3 个 String
变量、一个 int
变量和一个 ArrayList
的 String
] 项目。
现在我对所有变量都有正确的 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()
将正确地返回零项。
因为当你声明
时你声明的verses
ArrayList是空的
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'