只有在我没有预设ImageView图像时,延迟加载图像才有效?

时间:2013-10-30 15:59:13

标签: android android-imageview

我对this question的回答采用了类似的方法。唯一真正的区别是,我将图像保存到SoftReference<Bitmap,而不是基于/data/data/my.app/files的缓存,因为预计它们不会经常更改。我的适配器的getView()功能:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    //data from your adapter
    MyItem entry = getItem(position);
    //we want to reuse already constructed row views...
    if (convertView == null) {
        convertView = LayoutInflater.from(context).inflate(R.layout.appitem, null);
    }

    convertView.setTag(entry);

    TextView Name = (TextView)convertView.findViewById(R.id.Name);
    TextView Version = (TextView)convertView.findViewById(R.id.Version);
    final ImageView Icon = (ImageView)convertView.findViewById(R.id.Icon);

    Name.setText(entry.getName());
    Version.setText(entry.getVersion());
    Icon.setImageResource(R.drawable.default_icon); // the problem line

    try {
        final String _id = entry.getID();

        imageLoader.loadImage(_id, "<my url>", new ImageThreadLoader.ImageLoadedListener() {
            public void imageLoaded(Bitmap imageBitmap) {
                Icon.setImageBitmap(imageBitmap);
                notifyDataSetChanged();
            }
        });
    } catch (Throwable t) {
        Log.e("","", t); // nothing is hitting this log
    }

    return convertView;
}

上面标记的“问题行”,我将图标设置为默认图标,如果我删除该行,那么事情大多数工作正常(当重复使用视图时,它会在显示新图像之前显示旧图像)。如果该行存在,那么图像永远不会改变为其他任何东西。匿名ImageLoadedListener仍然在UI线程上运行,并在那里设置断点,显示一切似乎正常发生。我也知道ImageThreadLoader工作正常。文件显示在它们应该的位置并且看起来很好(并且当删除上面的问题行时它们会正常加载)。

为什么提前设置图像会导致以后无法更新?

1 个答案:

答案 0 :(得分:2)

预感:

删除notifyDataSetChanged()。

为什么呢?调用adapter.notifyDataSetChanged()将激活列表的完全刷新(即:每个视图的)。因此,每个项目的新调用getView(位置)。在此调用中,您再次将图像更改为default_icon。只有在设置好的后才会附加!

所以序列是:为一个图像设置default_icon,从磁盘加载一个图像,无效 - &gt;为ALL设置默认值,从磁盘加载一个图像,....

编辑:澄清解释,删除有关线程限制的假设。