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()
вызывает повторное создание элементов на экране, мой код правильный. Однако, похоже, что это не так, или, может быть, я что-то упустил. Как я могу сделать это работать плавно?