我正在创建一个Android应用程序,其中有带缩略图的新闻文章。这些缩略图从网络加载并存储在LruCache中,其中URL作为键,位图作为值。
private LruCache<String, Bitmap> tCache;
在适配器的getView()方法中,我调用getThumbnail()来检查缓存(必要时从网络加载),然后显示缩略图。
public void populateList(){
...
new Thread(new Runnable() {
@Override
public void run() {
getThumbnail(story, thumbnail);
}
}).start();
}
和
private Bitmap getThumbnail(Story story, ImageView imageView) {
String url = story.getThumbnail();
Bitmap bitmap;
synchronized (tCache) {
bitmap = tCache.get(url);
if (bitmap == null) {
bitmap = new ImageLoadingUtils(this, imageView).execute(url,
Boolean.TRUE).get();
tCache.put(url, bitmap);
}
}
return bitmap;
}
ImageLoadingUtils从网络加载,并在完成后将结果位图放入ImageView中。
@Override
protected void onPostExecute(Bitmap result) {
if (imageView != null) {
imageView.setImageBitmap(result);
adapter.notifyDataSetChanged();
}
}
问题是当我向下滚动时,缩略图在同一个ListView中重复。
________ |IMAGE1| |IMAGE2| |IMAGE3| SCREEN |IMAGE4| -------- |IMAGE1| |IMAGE2| OFFSCREEN ________
当我向下滚动然后向后滚动时,文章不再有正确的缩略图。这太乱了。
任何人都可以发现这个问题吗?非常感谢你。
答案 0 :(得分:2)
问题是因为视图在列表视图中重用。以下是如何在listview中异步缓存和加载缩略图的一个很好的示例。
答案 1 :(得分:0)
如果适配器的getView方法包含如下行:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if(convertView == null){
LayoutInflater inflater = (LayoutInflater) context.getSystemService(...);
convertView = inflater.inflate(...);
}
}
删除此“if”条件,并仅保留内部代码,例如:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(...);
convertView = inflater.inflate(...);
}