この質問の答えにも同様のアプローチを使用しています。唯一の本当の違いは、ベースのキャッシュの代わりに、あまり頻繁に変更されるとは思われないのでSoftReference<Bitmap
、画像を保存していることです。/data/data/my.app/files
私のアダプターのgetView()
機能:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
//data from your adapter
MyItem entry = getItem(position);
//we want to reuse already constructed row views...
if (convertView == null) {
convertView = LayoutInflater.from(context).inflate(R.layout.appitem, null);
}
convertView.setTag(entry);
TextView Name = (TextView)convertView.findViewById(R.id.Name);
TextView Version = (TextView)convertView.findViewById(R.id.Version);
final ImageView Icon = (ImageView)convertView.findViewById(R.id.Icon);
Name.setText(entry.getName());
Version.setText(entry.getVersion());
Icon.setImageResource(R.drawable.default_icon); // the problem line
try {
final String _id = entry.getID();
imageLoader.loadImage(_id, "<my url>", new ImageThreadLoader.ImageLoadedListener() {
public void imageLoaded(Bitmap imageBitmap) {
Icon.setImageBitmap(imageBitmap);
notifyDataSetChanged();
}
});
} catch (Throwable t) {
Log.e("","", t); // nothing is hitting this log
}
return convertView;
}
アイコンをデフォルトのアイコンに設定した上記のマークされた「問題行」。その行を削除すると、ほとんど問題なく動作します(ビューを再利用すると、新しい画像を表示する直前に古い画像が表示されます)。その行が存在する場合、画像は他のものに変更されることはありません。匿名ImageLoadedListener
は引き続き UI スレッドで実行され、そこにブレークポイントを設定すると、すべてが正常に行われているように見えます。ImageThreadLoader
また、が正しく機能していることもわかっています。ファイルは、本来あるべき場所に表示され、問題なく表示されます (上記の問題行が削除されると、問題なく読み込まれます)。
イメージを事前に設定すると、後で更新できなくなるのはなぜですか?