我正在从 xml 中检索大约 20 个图像 url,并将它们显示在 gridview 中。事情进展顺利,除了一个。
当我向下滚动新图像时开始加载,但是当我再次向上滚动时。先前加载的图像再次启动加载。
我该如何解决这个错误。以前加载的图像应该保留在布局中,为什么它不保留自己。
我正在使用适配器扩展 BaseAdapter 来查看图像
我正在从 xml 中检索大约 20 个图像 url,并将它们显示在 gridview 中。事情进展顺利,除了一个。
当我向下滚动新图像时开始加载,但是当我再次向上滚动时。先前加载的图像再次启动加载。
我该如何解决这个错误。以前加载的图像应该保留在布局中,为什么它不保留自己。
我正在使用适配器扩展 BaseAdapter 来查看图像
Gridview 与继承 AdapterView 的任何其他视图一样,仅使用您在屏幕上看到的视图数量。所以当你滚动你的视图将被重用。适配器的职责是将内容重新分配给视图。
所以,你需要缓存你的位图。在 Android 开发人员方面有一个非常好的教程。 http://developer.android.com/training/displaying-bitmaps/cache-bitmap.html
(我在示例中使用网格视图)
每次滚动时,都会调用适配器的 getView() 方法。
因此,每当一个视图进入屏幕时,都会在 getView() 方法中构建。您在该方法中构建新视图,我想您在调用该方法时下载图像,然后一种解决方案是缓存图像。如果您下载的图像很少且尺寸很小,则带有键 url 和值位图的简单 Map 可以解决问题,如果没有,请使用数据库。
每次调用 getView() 时,首先检查图像是否在缓存中,如果图像在缓存中,则使用它来构建视图,如果不下载它。
使用此博客http://blog.blundell-apps.com/imageview-with-loading-spinner/中的 LoaderImageView并添加以下功能
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();
}