2013-04-30 52 views
3

我有一个显示两列图像的gridview。我加载这些图像与异步任务(请参阅这篇文章Lazy load of images in ListViewAndroid - Gridview图像在滚动上混合

但是,当我滚动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); 

等待您的帮助

感谢

回答

3

这是因为资源再利用的。你应该做的:

  1. 首先,只需设置某种默认图像到您的ImageView(contentView.image.setImageResource(DEFAULT_RESOURCE))getView方法内(过渡默认画面比错一个更好)。

  2. 为您的图片设置唯一标签,例如要加载的图片的位置或网址(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 ImageView分配内存的N项。它只存储可见项目和一些保留的ImageView所需的金额。因此,不保证您存储的参考文件将在几秒内实际发生,因为它可能变得不可见并且被可见文件重复使用。

+0

添加了这一行。但没有任何改变。它显示旧图像,并在异步任务完成时用新图像进行更改。有时它也显示错误的图像。我认为异步任务指向错误的图像控制。还尝试将标记设置为imageview。 – dracula 2013-04-30 11:47:45

+0

是的,也可能因为视图重用而发生(例如,由于流过屏幕边缘而变得不可见的ImageView可以被重复用于具有相同内存指针的可见视图)。但设置标签肯定会帮助你(并帮助我多次)。 – 2013-04-30 12:05:10

+0

设置网址标签和比较标签与网址字符串为我工作:)非常感谢你安德烈。这真的很头疼 – dracula 2013-04-30 12:34:08

0

请勿自行加载图像。使用Universal Image Loader。它可以缓存,图像和加载位图。让你的问题消失。它还支持显示存根图像和滚动时自动暂停等。

它解决您的具体问题,只需加载imageView的最后一个实例的图像,如果你重用它。

imageLoader.displayImage(imageUri, imageView); 

是异步加载图像所需的全部内容。

+0

我使用DrawableManager ..见第2篇文章。 http://stackoverflow.com/questions/541966/how-do-i-do-a-lazy-load-of-images-in-listview – dracula 2013-04-30 12:27:37

+0

该职位是3岁。世界已经改变。使用UIL。只要看看你发布的问题。 – richardwiden 2013-04-30 12:32:45

+0

我会尝试UIL.Thank你 – dracula 2013-04-30 12:39:42