Android LRU Cache没有显示正确的位图?

时间:2012-12-30 15:28:04

标签: java android asynchronous android-listview android-lru-cache

我正在创建一个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
________

当我向下滚动然后向后滚动时,文章不再有正确的缩略图。这太乱了。

任何人都可以发现这个问题吗?非常感谢你。

2 个答案:

答案 0 :(得分:2)

问题是因为视图在列表视图中重用。以下是如何在listview中异步缓存和加载缩略图的一个很好的示例。

Lazy Load ListView Android

答案 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(...);
}