我有一个gridview,显示两列图像视图。我正在使用异步任务加载这些图像(请参阅此文章Lazy load of images in ListView)
但是当我滚动gridview时,位置中的图像正在混合。例如,第14张图像显示第1张图像,我认为视图试图在异步任务完成之前显示旧图像。
我的代码:
public Content getItem(int position) {
return contents.get(position);
}
public long getItemId(int position) {
return position;
}
@Override
public boolean hasStableIds() { return true; }
public View getView(int position, View convertView, ViewGroup parent) {
Thumbnail contentView;
Content current = contents.get(position);
if (convertView == null) {
contentView = new Thumbnail(mContext);
}
else {
contentView = (Thumbnail) convertView;
}
contentView.title = current.getTitle();
contentView.image = current.getImage();
contentView.link = current.getLink();
contentView.init();
return contentView;
}
初始化功能
TextView titleText = (TextView)super.findViewById(R.id.titleText);
titleText.setText(title);
ImageView imageControl = (ImageView)super.findViewById(R.id.thumbImage);
DrawableManager loadImage = new DrawableManager(); loadImage.fetchDrawableOnThread(imgUrl, imageControl);
等待你的帮助
由于
答案 0 :(得分:3)
这是因为资源重用。你应该做什么:
首先,只需在getView方法中为imageView(contentView.image.setImageResource(DEFAULT_RESOURCE)
)设置某种默认图像(过渡默认图片优于错误图片)。
为图片设置唯一标记,例如,要加载的图片的位置或网址(contentView.image.setTag(url)
)。
当AsyncTask完成时,您可以使用一些检查,如
String url=(String)imageView.getTag();
if (url.equals(mUrl)) { //mUrl can be transmitted to AsyncTask instance separately
mActivity.runOnUiThread(new Runnable() {
@Override
public void run() {
imageView.setImageDrawable(bmp);
});
});
}
这是必需的,因为Adapter
没有为N个项目的所有N ImageView
分配内存。它只存储可见项目和一些保留的ImageView所需的数量。因此,不保证您存储的ImageView
引用将在几秒钟内实际存在,因为它可能变得不可见并被可见的重用。
答案 1 :(得分:0)
请勿自行加载图片。使用Universal Image Loader。它可以缓存,图像和加载的位图。让你的问题消失。它还支持显示存根图像和滚动时自动暂停等。
只有在重复使用imageView的最后一个实例时,它才能解决您的特定问题。
imageLoader.displayImage(imageUri, imageView);
是否需要异步加载图像。