Android listview图片加载问题

标签 android listview imageview

我有一个包含几个 ListView 的应用程序。 ListView 包含由 ImageView 和 TextView 组成的项目。

所有图片在服务器上都是缩略图大小,用于加载它们的模式如下:

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

    1. 将缩略图 uri 和 ImageView 实例传递给 DrawableManagers getImageAsync 方法

    2. 如果图像存在,该方法将首先查看 sd 卡,如果从 sd 卡加载它并保存软引用 + 更新 imageview drawable

    3. 如果 sd 上不存在。从 HTTP 获取并保存在 SD 上(如果有足够的空间)作为软引用并更新 imageview 可绘制对象。

当图像存在于 SD 卡上时,一切正常。但是第一次(或在没有 SD 卡的情况下使用应用程序时)滚动时图像似乎填充到错误的 ListView 行中。当我停止滚动时,问题会在几秒钟后自行解决。

这几乎就像 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;
}

最佳答案

这是ListView使用的View回收...

传递给您的 getView() 的 convertView 参数可以引用一个现有的项目,该项目已经滚出列表的显示部分,并且可以重新用于显示现在出现的项目。

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

(另一种假设无限内存的懒惰开发人员实现将忽略 convertView 参数并在每次调用它时实例化新的信息行 View 。不要那样做。:))。

关于Android listview图片加载问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4977935/

相关文章:

android - 使用云中的VM构建Android自定义ROM

php - 无法运行查询 : SQLSTATE[HY093]: Invalid parameter number: parameter was not defined using webservice

android - ADB/Shell 命令来管理通知 channel ?

android - 如何从 AsyncTask 更新 ListView?

java - 将数据从 Activity 传递到可滑动 View fragment

android - ImageView: onDraw方法绘制 "behind"图片背景,不在顶部

java.lang.OutOfMemory错误: Failed to allocate a 571401228 byte allocation with 16777216 free bytes and 495MB until OOM

java - Android - 如何在 View 组内设置 subview

android - 将子项添加到 Android 中的 ListView

android - 加载图像并单击上一个按钮不会在 android 中加载图像