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