を使用して連絡先のリスト (名前 + 写真) を表示していListView
ます。初期ロードを高速化するために、最初に名前のみをロードし、画像のロードを遅らせます。これで、バックグラウンド スレッドが画像の読み込みを完了するたびに、アダプターnotifyDataSetChanged()
が UI スレッドで呼び出されるようにスケジュールされます。残念ながら、これが発生した場合、は既に画面に表示されているアイテムをListView
再レンダリング (つまり、呼び出し) しません。getView()
このため、ビューが再利用されるように、ユーザーがスクロールして同じ項目のセットに戻らない限り、新しく読み込まれた画像は表示されません。関連するコードの一部:
private final Map<Long, Bitmap> avatars = new HashMap<Long, Bitmap>();
// this is called *on the UI thread* by the background thread
@Override
public void onAvatarLoaded(long contactId, Bitmap avatar) {
avatars.put(requestCode, avatar);
notifyDataSetChanged();
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// snip...
final Bitmap avatar = avatars.get(contact.id);
if (avatar != null) {
tag.avatar.setImageBitmap(avatar);
tag.avatar.setVisibility(View.VISIBLE);
tag.defaultAvatar.setVisibility(View.GONE);
} else {
tag.avatar.setVisibility(View.GONE);
tag.defaultAvatar.setVisibility(View.VISIBLE);
if (!avatars.containsKey(contact.id)) {
avatars.put(contact.id, null);
// schedule the picture to be loaded
avatarLoader.addContact(contact.id, contact.id);
}
}
}
notifyDataSetChanged()
AFAICT、画面上のアイテムが再作成されると仮定すると、私のコードは正しいです。しかし、それは真実ではないようです。または、何かが足りないのかもしれません。どうすればこれをスムーズに機能させることができますか?