ListView не обновляет уже видимые элементы

Я отображаю список контактов (имя + изображение), используяListView, Для быстрой начальной загрузки я сначала загружаю только имена и откладываю загрузку изображений. Теперь, когда мой поток b, ackground заканчивает загрузку картинки, он планирует мой адаптерnotifyDataSetChanged() быть вызванным в потоке пользовательского интерфейса. К сожалению, когда это происходит,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);
        }
    }
}

AFAICT, если вы предполагаете, чтоnotifyDataSetChanged() вызывает повторное создание элементов на экране, мой код правильный. Однако, похоже, что это не так, или, может быть, я что-то упустил. Как я могу сделать это работать плавно?

Ответы на вопрос(3)

Ваш ответ на вопрос