0

バックグラウンドスレッドで大量の画像をダウンロードするアプリがあります。各アイコンがダウンロードされると、BaseAdapterをサブクラス化するカスタムアダプターのArrayListに追加します。BaseAdapterを使用するListViewの各行には、ImageViewがあります。getViewでは、次のことを行います。

public View getView(int position, View convertView, ViewGroup parent) {
    final MyCustomImageClass imageObject = data.get(position);
    View vi = convertView;

    if(convertView==null) {
        vi = inflater.inflate(R.layout.list_row, null);
    }

    ImageView thumbnail = (ImageView)vi.findViewById(R.id.list_image);
    File appDir = new File(Utils.getAppFilesDir() +"");
    File imageFolder = new File(appDir, imageObject.getImageFolderName());
    File imageDir = new File(imageFolder, imageObject.getIconFilename());
    Log.e("myapp", "row image dir: " + imageDir.toString());
    if(imageDir.exists()) {
        Bitmap imageBitmap = BitmapFactory.decodeFile(imageDir.toString());
        thumbnail.setImageBitmap(imageBitmap);
    }
    thumbnail.invalidate();
}

しかし、私が見ているのは、thumbnail古い画像を再利用しているということです。同様に、logcatで別のパスが表示されていても、最初の数行は同じサムネイル画像になります。

ListViewの行に、そのImageViewに新しいビットマップイメージがあることを通知するにはどうすればよいですか?

4

2 に答える 2

0

の各行はListViewリサイクルされるため、1つが画面から消えると、次の行はそのコンテナを再利用します。おそらくif、新しい更新に関するステートメントを満たしていないImageViewため、イメージが希望どおりに設定されていないため、古いイメージが再利用されます。imageDir.exists()新しいビューが正しく更新されるように、が正常に完了することを確認してください。また、invalidateと呼ぶ理由はないと思います。

編集:あなたがinvalidate()今電話をかけている理由はわかりますが、それでも必要ではありません。ImageViewアンドロイドが提供するもののように、のデフォルトの画像を使用することをお勧めします。次に、次のようなことを行います。

if(imageBitmap != null)
  thumbnail.setImageBitmap(imageBitmap);
else
  thumbnail.setImageDrawable(R.drawable.content_picture);

ここR.drawable.content_pictureで、はデフォルトの「表示する画像なし」の画像でありImageView、XMLファイルでに定義されている画像でもあります。

最後に、ViewHolderのレンダリングを高速化するためにを使用することを検討する必要がありますListView。次に例を示します。ビューホルダーを実装する方法は?

ここで私が言ったことが意味をなさない場合は、説明を求めてください。

于 2013-01-27T00:38:11.517 に答える
0

アダプタは、画像だけでなく、リストアイテム全体をリサイクルしています。新しいビットマップがデコードされるのを待つ間、画像リソースをプレースホルダーにリセットする必要があります。

ちなみに、UIスレッドでディスクを読み取ったり、ビットマップをデコードしたりするべきではありません。getView()メソッドは、非常に迅速に確実に戻る必要があります。これにより、そこで実際の作業を行うことができなくなります。ビットマップを処理する方法に関する優れたヒントについては、開発ガイドを確認してください。

http://developer.android.com/training/displaying-bitmaps/index.html

于 2013-01-27T00:39:22.173 に答える