我正在尝试开发的应用程序有问题。 这是Android的音乐游戏,我从iTunes获取所有数据。
这是我获取数据的部分。我有2个列表:
这是填充列表的代码:
try
{
int randomLookupId;
JSONObject obj = getJSONObject(url);
JSONArray jsonArray = obj.getJSONArray("resultIds");
for(int i = 0; i < 10; i++)
{
canzoni.clear();
randomLookupId = new Random().nextInt(jsonArray.length());
JSONObject finalObj = getJSONObject("http://itunes.apple.com/lookup?id="+jsonArray.getString(randomLookupId));
JSONArray finalJsonArray = finalObj.getJSONArray("results");
JSONObject returnObj = finalJsonArray.getJSONObject(0);
canzoni.add(returnObj.getString("previewUrl"));
canzoni.add(returnObj.getString("artistName"));
canzoni.add(returnObj.getString("trackName"));
canzoni.add(returnObj.getString("artistViewUrl"));
canzoni.add(returnObj.getString("artworkUrl100"));
Canzone.dieciCanzoni.add(i, canzoni);
}
}
catch (JSONException ignored)
{
ignored.getCause();
}
catch (MalformedURLException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
信息的检索效果非常好,我只有一个问题:当我清除列表canzoni时,我注意到列表dieciCanzoni也被清除了,显然我不希望这样!
如果我评论清除canzoni列表的行,在dieciCanzoni列表中只插入canzoni中的最后一个值,即使先前插入的值也会改变!
你能帮我解决一下吗?
谢谢大家!
答案 0 :(得分:0)
您需要使用深层副本:
Canzone.dieciCanzoni.add(i, canzoni.clone());
或:
Canzone.dieciCanzoni.add(i, newArrayList<String>(canzoni));
正在发生的事情Canzone.dieciCanzoni.add(i, canzoni);
仅指向存储信息的相同位置。当您清除任一列表时,您将清除它们的一个位置。 “深层复制”会复制数据,因此每个列表都有自己的副本。
更好的是,不要使用clear()
。只需从一开始就为canzoni
创建一个新列表。替换:
canzoni.clear();
使用:
canzoni = new ArrayList<String>();