0

この質問の答えにも同様のアプローチを使用しています。唯一の本当の違いは、ベースのキャッシュの代わりに、あまり頻繁に変更されるとは思われないので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また、が正しく機能していることもわかっています。ファイルは、本来あるべき場所に表示され、問題なく表示されます (上記の問題行が削除されると、問題なく読み込まれます)。

イメージを事前に設定すると、後で更新できなくなるのはなぜですか?

4

1 に答える 1

2

予感:

notifyDataSetChanged() を削除します。

なんで?呼び出し adapter.notifyDataSetChanged() は、リスト (つまり、各ビュー) の完全な更新を引き起こします。そのため、各アイテムの getView(position) への新しい呼び出し。この呼び出しでは、画像を default_icon に再度変更します。この追加は、良いものを設定した直後です!

したがって、シーケンスは次のとおりです。1つのイメージにdefault_iconを設定し、ディスクから1つのイメージをロードし、無効化->すべてのデフォルトを設定し、ディスクから1つのイメージをロードします....

編集: 説明を明確にし、スレッド制限に関する仮定を削除します。

于 2013-10-30T16:36:50.907 に答える