Android列表视图图片加载问题

时间:2011-02-12 12:01:38

标签: android listview imageview

我有一个包含几个列表视图的应用程序。列表视图包含由图像视图和文本视图组成的项目。

所有图像都在服务器上缩放尺寸,用于加载它们的图案如下:

  • 实例化DrawableManager
  • 在getView()方法中
  • 我执行以下操作:

    1. 将拇指uri和ImageView实例传递给DrawableManagers getImageAsync方法

    2. 如果图像存在,该方法将首先查看SD卡,如果是这样,从SD卡加载并保存软参考+更新imageview drawable

    3. 如果sd上不存在。从HTTP获取并保存在SD上(如果有足够的空间)作为软参考并更新imageview drawable。

当SD卡上存在图像时,一切正常。但第一次(或使用没有SD卡的应用程序时)图像似乎在滚动时填充到错误的列表视图行中。当我停止滚动时,问题会在几秒钟后自行修复。

它几乎就像是将ImageView引用合并在一起。

有什么想法吗?

我还包括getView方法:

public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder vh;
    if (convertView == null) {
        convertView = inflater.inflate(R.layout.informationrow, null);
        vh = new ViewHolder();
        vh.imageView = (ImageView) convertView.findViewById(R.id.rowInformationIcon);
        vh.textView = (TextView) convertView.findViewById(R.id.rowInformationTitleLine);
        convertView.setTag(vh);
    }
    else {
         vh = (ViewHolder) convertView.getTag();
    }

    CustomCategory cc = items.get(position);
    if (cc != null) {
        vh.textView.setText(cc.get_name());
        if (cc.getMediaUrl() != null) {
            _drawMgr.fetchDrawableOnThread(cc.getMediaUrl(), vh.imageView);
             vh.imageView.setBackgroundDrawable(getResources().getDrawable(R.drawable.imageframe));
        }
        else {
             vh.imageView.setImageDrawable(getResources().getDrawable(R.drawable.trans4040));
            vh.imageView.setBackgroundDrawable(null);
        }
    }

    return convertView;
}

2 个答案:

答案 0 :(得分:1)

这是ListView ...

使用的查看回收

传递给getView()的convertView参数可以引用已滚动显示列表部分的现有项目,并且可以重复使用以显示现在出现的项目

所以,是的,相同的ImageView将在您发布的代码中的多次下载中重复使用。在你的getView()中你应该检查下载是否已经挂起并在不再需要时取消它(或者让它在某处完成到FIFO图像缓存,但是不要触摸现在最近需要的ImageView-开始下载了。)

(一种替代的,懒惰的开发人员实现,假设无限的内存将忽略convertView参数并在每次调用时实例化新的informationrow视图。不要这样做。:))。

答案 1 :(得分:1)

使用此库在ListView中加载图像。 https://github.com/nostra13/Android-Universal-Image-Loader