6

に遅延読み込み画像を実装しましたListView。を使用しAsyncTaskてインターネットから画像をダウンロードし、UIThread の ImageView にバインドします。

ListView変化を速くスクロールすると、ダウンロードされた画像がリスト内の間違った項目にバインドされることがあることを除いて、機能しています。

convertView問題は、での再利用によるものだと思いBaseAdapterます。それを解決するためのアイデアはありますか?

どうもありがとう。

編集:次のように回答を投稿します。

public void setBitmap(int position, Bitmap image) {
    View itemView = mListView.getChildAt(position - mListView.getFirstVisiblePosition());
    if (itemView != null) {
        ImageView itemImageView = (ImageView) itemView.findViewById(R.id.item_imageview);
        itemImageView.setImageBitmap(image);
    }
}
4

2 に答える 2

7

ListViewでの画像の遅延読み込み中に発生する2つの問題があります。

  1. 新しい画像が読み込まれるまで、古い画像は引き続き表示されます。これは簡単です。画像のダウンロードを開始する前に、ImageViewを画像の読み込み中のビューに設定するか、非表示に設定するだけです。
  2. 2番目の問題は解決が困難です。リストを非常に高速にスクロールしていると想像してください。これで、古いAsyncTaskが画像の読み込みを完了する前に、ビューを再利用できます。これで、onPostExecuteメソッドで画像をimageviewに設定する2つのタスクを実行できます。これで、2番目のタスクが終了するまで、しばらくの間、間違った画像が表示されます。さらに悪いことに、ネットワーク関連の理由で、開始した順序で終了せず、間違った画像が正しい画像を上書きします。これを解決するには、タスクの終了後に表示される画像を確認する必要があります。Viewクラスには、このようなもののための2つのメソッドがあります。

    setTaggetTag頭に浮かんだimageviewに任意のオブジェクトをバインドできます。ほとんどの場合、タスクを開始する前に、setTagを使用して画像のURLを文字列としてimageviewにバインドします。これで、タスクの終了後にgetTagを文字列にキャストし、表示されるURLをダウンロードしたURLと比較し、必要な場合にのみ画像を設定できます。

于 2010-09-22T07:33:36.053 に答える
2

void setBitmap(Bitmap bitmap, int position)アダプターで呼び出される関数または類似の関数を作成します。新しいビットマップが利用可能になったら、AsyncTask がこのメソッドを呼び出せるようにします。このメソッドは、UI スレッド自体を呼び出しnotifyDataSetChanged()て、ビューが確実に更新されるようにすることができます。アダプターでビューへの参照を保持することは (AsyncTask で保持する場合でも) 危険です!

于 2010-09-22T07:14:24.293 に答える