我正在使用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);
}
}
}
AFAICT,如果您认为这notifyDataSetChanged()
会导致重新创建屏幕上的项目,那么我的代码是正确的。但是,这似乎不是真的,或者我可能遗漏了一些东西。我怎样才能使这项工作顺利进行?