我正在从xml中恢复大约20个图像网址,并将它们显示在gridview中。 除了一个之外,事情变得很好。
当我向下滚动新图片开始加载,但是当我再次向上滚动时。以前加载的图像再次加载。
我该如何解决这个bug。以前加载的图像应该保留在布局中,为什么它不会保留自己。
我正在使用适配器扩展BaseAdapter来查看图像
答案 0 :(得分:2)
Gridview像继承AdapterView的任何其他视图一样,只使用您在屏幕上看到的视图数量。因此,滚动视图时将重复使用。适配器的职责是将内容重新分配给视图。
因此,您需要缓存位图。 Android开发人员方面有一个非常好的教程。 http://developer.android.com/training/displaying-bitmaps/cache-bitmap.html
(我在示例中使用网格视图)
答案 1 :(得分:1)
每次滚动时,都会调用适配器的getView()方法。
因此,每次进入屏幕的视图都是在getView()方法中构建的。 您在该方法中构建新视图,我想您在调用该方法时下载图像,然后一个解决方案是缓存图像。如果您下载的图片数量很少而且尺寸很小,只需使用关键网址和值位图来解决问题,如果没有,请使用数据库。
每次调用getView()时,首先检查图像是否在缓存中,如果图像在缓存中,则使用它来构建视图,如果没有下载它。
答案 2 :(得分:1)
使用此博客中的LoaderImageView http://blog.blundell-apps.com/imageview-with-loading-spinner/&添加以下功能
public void setImageDrawable(final MyGridViewItem obj) {
mDrawable = null;
if(obj.mDrawable != null){
mDrawable = obj.mDrawable
imageLoadedHandler.sendEmptyMessage(COMPLETE);
return;
}
mSpinner.setVisibility(View.VISIBLE);
mImage.setVisibility(View.GONE);
new Thread(){
public void run() {
try {
mDrawable = getDrawableFromUrl(imageUrl);
obj.mDrawable = mDrawable;
imageLoadedHandler.sendEmptyMessage(COMPLETE);
} catch (MalformedURLException e) {
imageLoadedHandler.sendEmptyMessage(FAILED);
} catch (IOException e) {
imageLoadedHandler.sendEmptyMessage(FAILED);
}
};
}.start();
}