Android列表添加问题

时间:2012-11-12 17:34:56

标签: android list

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

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

  1. 列表canzoni:大小5,字段:previewUrl,artistName,trackName,artistViewUrl和artworkUrl100。
  2. 列表dieciCanzoni:大小为10,必须包含上述列表中的10个元素。
  3. 这是填充列表的代码:

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

    你能帮我解决一下吗?

    谢谢大家!

1 个答案:

答案 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>();