1

開発しようとしているアプリケーションに問題があります。Android向けの音楽ゲームで、データはすべてiTunesから取得しています。

これは、データを取得する部分です。私は2つのリストを持っています:

  1. リスト カンゾーニ: サイズ 5、フィールド: previewUrl、artistName、trackName、artistViewUrl、artworkUrl100。
  2. リスト 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();
    }

情報の取得は非常にうまく機能しますが、1 つだけ問題があります。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);を指しているだけです。いずれかのリストをクリアすると、両方の1 つの場所がクリアされます。「ディープ コピー」はデータを複製するため、各リストには独自のコピーがあります。


いっそのこと、使用しないでくださいclear()。最初から新しいリストを作成するだけcanzoniです。交換:

canzoni.clear();

と:

canzoni = new ArrayList<String>();
于 2012-11-12T17:42:43.507 に答える