1

我正在尝试开发的应用程序有问题。这是一款安卓的音乐游戏,我从 iTunes 获取所有数据。

这是我获取数据的部分。我有 2 个列表:

  1. 列出canzoni:大小5,字段:previewUrl、artistName、trackName、artistViewUrl 和artworkUrl100。
  2. List dieciCanzoni:大小为 10,必须包含上述列表的 10 个元素。

这是填充列表的代码:

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中的最后一个值,即使之前插入的值也会改变!

你能帮我弄清楚吗?

谢谢你们!

4

1 回答 1

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>();
于 2012-11-12T17:42:43.507 回答