这是一个非常常见的场景:在 ListView 中显示必须从互联网下载的图像。
现在我有一个 ArrayAdapter 的自定义子类,用于 ListView。在 ArrayAdapter 的 getView() 实现中,我生成一个单独的线程来加载图像。加载完成后,它会查找适当的 ImageView 并使用 ImageView.setImageDrawable() 设置图像。所以我使用的解决方案与此类似:ListView 中图像的延迟加载
我遇到的问题是,一旦我在 ImageView 上调用 setImageDrawable() ,ListView 就会以某种方式刷新列表中当前所有可见的行!这会导致无限循环:
- getView() 被调用
- 产生线程来加载图像
- 图像已加载;在 ImageView 上调用 setImageDrawable()
- ListView 由于某种原因拾取它并自行刷新
- 为了刷新 ListView,为每个可见行调用 getView(),因此我们返回到步骤 1,整个过程会重复进行
据我所知,“Android - 如何在 ListView 中延迟加载图像”(请参阅上面的链接)中提出的解决方案根本不起作用。它可能看起来像这样,但它运行速度非常慢,因为在后台,它不断重新加载当前可见的行。
有人以前遇到过这个问题和/或有解决方案吗?
我使用了以下链接中的代码:另一个 stackoverflow 问题
为了解决回收视图问题,我做了一些小改动。我将图像的 url 设置为适配器中 imageview 的标签。以下代码包含我解决回收问题的解决方案:
public void fetchDrawableOnThread(final String urlString, final ImageView imageView,Drawable drw) {
imageView.setImageDrawable(drw);//drw is default image
if (drawableMap.containsKey(urlString)) {
if(imageView.getTag().toString().equals(urlString))
{
imageView.setImageBitmap(drawableMap.get(urlString));
imageView.invalidate();
return;
}
}
final Handler handler = new Handler() {
@Override
public void handleMessage(Message message) {
BitmapWrapper wrapper = (BitmapWrapper)message.obj;
if(wrapper.imageurl.equals(imageView.getTag().toString()))
{
imageView.setImageBitmap((Bitmap)wrapper.bitmap);
imageView.invalidate();
}
}
};
Thread thread = new Thread() {
@Override
public void run() {
//TODO : set imageView to a "pending" image
Bitmap drawable = fetchDrawable(urlString);
BitmapWrapper wrapper = new BitmapWrapper();
wrapper.bitmap = drawable;
wrapper.imageurl = urlString;
Message message = handler.obtainMessage(1, wrapper);
handler.sendMessage(message);
}
};
thread.start();
}
public class BitmapWrapper
{
public Bitmap bitmap;
public String imageurl;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)