getStringArrayList仅获取最后一个列表而不考虑名称

时间:2019-03-04 22:27:56

标签: android

我尝试将多个列表发送到其他活动,因此我编写了以下代码:

ArrayList<String> sections = new ArrayList<String>();
for(int i=1; i<=last; i++) 
{
    sections.clear();
    for(j = 0; j < size; j++)
    {
        sections.add(someText);
    }
    ourIntent.putStringArrayListExtra("sections_"+i, sections);
}

如您所见,对于每个i循环周期,我给发送列表的名称都是不同的(sections_1,sections_2,...)。

在每个循环循环中清除节列表。在调试模式下,我可以看到在每个循环周期中,这些部分都有正确的列表。

问题出在下一个活动中。当我列出列表时,使用以下代码:

sections1 = extras.getStringArrayList("sections_1");
sections2 = extras.getStringArrayList("sections_2");    

sections1和sections2获得相同的列表,这是在putStringArrayListExtra中插入的最后一个列表。

任何人都可以解释这种行为吗?

1 个答案:

答案 0 :(得分:1)

我认为这是因为它存储的是对您的ArrayList的引用,而不是循环的每次迭代时列表的当前“状态”的副本。

例如,当您的ArrayList包含1个项目时,您首先要插入对其的引用。接下来,在包含两个项目的ArrayList上插入一个引用。两者都是参考,因此当您实际过渡到下一个Activity时,它会复制完整的ArrayList

要解决此问题,实际上您可以在每次循环时制作ArrayList的本地副本。

ArrayList<String> sections = new ArrayList<String>();
for(int i=1; i<=last; i++) {
    sections.clear();
    for(j = 0; j < size; j++){
        sections.add(someText);
    }

    // Creating a new local copy of the current list.
    ArrayList<String> newList = newArrayList<>(sections);

    // Inserting the local copy instead.
    ourIntent.putStringArrayListExtra("sections_"+i, newList);
}