2012-01-09 12 views
0

私はListViewのための真っ直ぐなBaseAdapterを持っています。 JSONフィードをダウンロードし、その行にデータを表示します。ビューを含むViewHolderと、 "Story"というデータオブジェクトがあります。すべてがうまく動作します。convertViewがリサイクルされるとListViewアダプタが混乱します

しかし、長いリストをスクロールした後、私は2つのことに気づきます。

1)私のログは、さらに下にスクロールすると、アダプタがフィードをリロードしていることを示しています。私はJSON配列全体を変数に入れてしまったので、なぜこれをリロードする必要があるのですか?これは奇妙です。

2)さらに重要なことは、前後にスクロールした後、行に間違った「ストーリー」オブジェクトが含まれていることです。 getViewルーチンの関連部分を次に示します。

public View getView(int position, View convertView, ViewGroup parent) { 
    ViewHolder holder; 
    Story story = stories.get(position); 
    if (convertView == null) { 
     //create holder 
     holder = new ViewHolder(); 
     convertView = inflator.inflate(R.layout.story_list_item, parent, false); 
     holder.titleView = (TextView) convertView.findViewById(R.id.story_list_title); 
     holder.dateView = (TextView) convertView.findViewById(R.id.story_list_date); 
     holder.story = story; 
     holder.imageView = (ImageView) convertView.findViewById(R.id.story_list_image); 
     convertView.setTag(holder); 
     } else { 
      holder = (ViewHolder) convertView.getTag(); 
     }  
    // configure the view  
    holder.titleView.setText(story.title); 
    return convertView; 
} 

シンプルで十分です。奇妙なことは、if文if (convertView == null)を削除することによって問題を解決できることです(行のリサイクルも排除していると思います)。

しかし、私はこのようにメモリの問題にぶつかりませんか?プレーンなバニラバージョンはなぜ機能しないのですか?

ありがとうございました。 よろしく、 S

+0

JSONフィードがどこにダウンロードされているのかはわかりませんが、十分速くスクロールすると、最初のフィードのダウンロードが完了する前に再生される可能性があります。次に、2番目のフィードのダウンロードが開始され、最初にダウンロードが完了すると、最初のダウンロードが完了した時点で、それがある意味で「上書き」されます。 http://android-developers.blogspot.com/2010/07/multithreading-for-performance.html – danh32

+0

ありがとう、私は間違いなくそれを追求するでしょう。 – Mundi

答えて

1

あなたが唯一

holder.story = story 
convertView == null

を代入していることを知っていますか?あなたのconvertViewのケースの直後にholder.story = storyを移動することを検討してください。それはもっとうまくいくはずです。 Btw、あなたはあなたのビューホルダーの中に「ストーリー」を保存する必要がありますか?典型的には、そのパターンは、実際の位置のデータではなく、ビューの保存と状態情報の表示にのみ使用する必要があります。

+0

それは、ありがとうございます。しかし、**あなたは実際にデータをどのように送信していますか?さまざまなテキストビューなどのテキストと同じように?どのようにあなたはそれを置くだろう別のビューによって読み込まれる画像のURLについてはどうですか?再度、感謝します。 – Mundi

+0

アクティビティ間で送信しますか? ContentProviderを使用している場合、通常はクリックされたアイテムに対してUriを渡します.JSONの場合、インテントの追加情報(あなたの場合は "stories"配列から読み込まれます)に関連情報を送ります。ストーリーのためのParcelableを実装するか、それを「バンドル」のエクストラに書き込み、それをインテントに送信しますか? – Jens

+0

それは私がやっていることです - エクストラバンドルでデータを送信する。しかし、私はParcelableが本当の苦痛とエラーでいっぱいであることを発見しました。だから私は私のStoryの各属性を送るために多くのコード行を使用しています... iOSから来て、これは本当にかなり厄介です。 – Mundi

関連する問題