2010-10-16 110 views
1

要显示&在我的ListView中加载图像我创建了一个自定义的ArrayAdapter,但它非常慢。每当我滚动列表时,它会再次加载图像。Android ArrayAdapter&ListView缓慢

是否有缓存机制会缓存我的视图,所以我不需要每次都重新填充它们?我知道ViewHolder方法,但是这仍然是缓慢的,或者我只是使用它错了?

我的代码:

public class ImageArrayAdapter extends ArrayAdapter<HashMap<String, String>> { 

private int resourceId = 0; 
private LayoutInflater inflater; 

public ImageArrayAdapter(Context context, int resource, 
     List<HashMap<String, String>> objects) { 
    super(context, 0, objects); 

    this.resourceId = resource; 
    this.inflater = (LayoutInflater) context 
      .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
} 

public static class ViewHolder { 
    public TextView title; 
    public TextView text; 
    public WebImageView image; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    View view = convertView; 
    ViewHolder holder; 

    if (view == null) { 
     view = inflater.inflate(resourceId, parent, false); 

     holder = new ViewHolder(); 

     holder.text = (TextView) view.findViewById(R.id.item_text); 
     holder.image = (WebImageView) view.findViewById(R.id.item_image); 
     holder.title = (TextView) view.findViewById(R.id.item_title); 

     view.setTag(holder); 
    } else { 
     holder = (ViewHolder) view.getTag(); 
    } 

    HashMap<String, String> item = (HashMap<String, String>) getItem(position); 

    holder.text.setText(item.get("text")); 
    holder.title.setText(item.get("title")); 
    holder.image.setImageUrl(item.get("image")); 
    holder.image.loadImage(); 

    return view; 
} 

}

+0

你看这篇文章? http://stackoverflow.com/questions/541966/android-how-do-i-do-a-lazy-load-of-images-in-listview – Nolesh 2012-06-01 06:19:40

回答

2

您可以将您的位图在LRU(最近最少使用)的基础上SoftReferences缓存。

这种类型的高速缓存将最常用的对象保存在内存中,当系统内存不足时,SoftReference的使用允许GarbageCollector释放这些资源。

这是我目前正在使用我的应用程序EmailAlbum实现: http://code.google.com/p/emailalbum/source/browse/EmailAlbumAndroid/tags/REL-2_9_3/src/com/kg/emailalbum/mobile/util/NewLRUCache.java

这是从this French post关于Java缓存实现拍摄,我只是改名的一些方法,以允许的Hashmap切换到该高速缓存,而不必修改方法调用。

然后,您一定要避免每次从SDCard(或Web)读取图片时UI的速度变慢。那时你需要看看AsyncTask,它允许在后台线程中放置图片,同时让用户与UI交互(例如,即使在图片被加载时也能更快地滚动)。