4

画像を表示しているリストビューが表示されました。これらの画像はダウンロードされ、適切にキャッシュされます。リストを下にスクロールして新しいアイテムをロードするときに、最も使用頻度の低いアイテムをリサイクルしてメモリを節約したいと思います。画面に表示されていないビットマップにLRUマップとim呼び出しリサイクルを正常に実装しました。コードの一部は次のとおりです。

imageViewはViewGroupです

public void recycleImage(int res) {
    if (imageView != null) {
        imageView.setBackgroundDrawable(null);
        if (res > 0)
            imageView.setBackgroundResource(res);
    }

    if (bitmap != null && !bitmap.isRecycled()) {
        bitmap.recycle();

        Log.i(TAG, "Bitmap recycled");
    }
}

これらの値は、アダプターのgetViewメソッドに保存されます。問題は、画像をリサイクルすると、画面に表示されている画像も失われることを確認できることです(画面の外にあることがわかっている画像のみをリサイクルすることに注意してください)。

リストビューで他の人のビットマップをリサイクルしたときに、現在表示されている画像が失われる理由を誰かが知っていますか?

ここで、保存されているビットマップにアクセスしたり、ダウンロードしたりします。

   if (mImageMap.containsKey(url)) { 
       ImageCacheModel cache = mImageMap.get(url); 
       return cache.getBitmap(); 
   } else if (cacheManager.isUrlCached(url)) { 
       mImageMap.put(url, new ImageCacheModel(imageView, cacheManager.getCachedBitmapOrNull(url, 2)));

        ImageCacheModel cache = mImageMap.get(url);
        return cache.getBitmap();
    } else {
        cacheManager.addUrlToQueue(url, this, true);
    }
4

1 に答える 1

1

あなたの(リスト要素)のImageView内部は常に再利用されていることを覚えておく必要があります。convertViewつまりconvertView、新しいビューが表示されるたびに新しいビューを作成するのではなく、ListView実際には、スクロールアウトした最後の要素を再利用するだけです。

したがって、あなたの場合、いつでも3つのアイテムが表示されるリストがあるとします。アイテム1をクリアすると、アイテム4やアイテム7などもクリアされます。

この問題があなたを悩ませている正確なポイントを指摘することはできませんが、あなたの説明に基づいて、これが問題であるとほぼ確信しています。

于 2012-12-05T17:11:31.977 に答える