1

我正在从 xml 中检索大约 20 个图像 url,并将它们显示在 gridview 中。事情进展顺利,除了一个。

当我向下滚动新图像时开始加载,但是当我再次向上滚动时。先前加载的图像再次启动加载

我该如何解决这个错误。以前加载的图像应该保留在布局中,为什么它不保留自己。

我正在使用适配器扩展 BaseAdapter 来查看图像

4

3 回答 3

2

Gridview 与继承 AdapterView 的任何其他视图一样,仅使用您在屏幕上看到的视图数量。所以当你滚动你的视图将被重用。适配器的职责是将内容重新分配给视图。

所以,你需要缓存你的位图。在 Android 开发人员方面有一个非常好的教程。 http://developer.android.com/training/displaying-bitmaps/cache-bitmap.html

(我在示例中使用网格视图)

于 2012-09-07T09:40:59.220 回答
1

每次滚动时,都会调用适配器的 getView() 方法。

因此,每当一个视图进入屏幕时,都会在 getView() 方法中构建。您在该方法中构建新视图,我想您在调用该方法时下载图像,然后一种解决方案是缓存图像。如果您下载的图像很少且尺寸很小,则带有键 url 和值位图的简单 Map 可以解决问题,如果没有,请使用数据库。

每次调用 getView() 时,首先检查图像是否在缓存中,如果图像在缓存中,则使用它来构建视图,如果不下载它。

于 2012-09-07T09:47:02.167 回答
1

使用此博客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();
        }
于 2012-09-07T09:58:39.517 回答