2010-10-16 5 views
1

Pour afficher & charger des images dans ma ListView J'ai créé un ArrayAdapter personnalisé, mais il est vraiment lent. Chaque fois que je fais défiler la liste, il charge à nouveau les images.Android ArrayAdapter & ListView slowness

Existe-t-il un mécanisme de mise en cache qui mettra en cache mes vues de sorte que je n'ai pas besoin de les recharger à chaque fois? Je connais la méthode ViewHolder, mais elle est encore lente ou est-ce que je ne l'utilise pas correctement?

Mon code:

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

Avez-vous regardé cet article? http://stackoverflow.com/questions/541966/android-how-do-i-do-a-lazy-load-of-images-in-listview – Nolesh

Répondre

2

Vous pouvez stocker vos bitmaps dans un cache LRU (moins récemment) basé sur SoftReferences.

Ce type de cache conserve les objets les plus utilisés en mémoire, et lorsque les systèmes sortent de la mémoire, l'utilisation de SoftReference permet à GarbageCollector de libérer ces ressources.

Voici une implémentation J'utilise actuellement dans mon application EmailAlbum: http://code.google.com/p/emailalbum/source/browse/EmailAlbumAndroid/tags/REL-2_9_3/src/com/kg/emailalbum/mobile/util/NewLRUCache.java

Cela a été pris de this French post sur les implémentations de cache java, je viens rebaptisés quelques méthodes pour permettre le passage de hashmap à ce cache sans avoir à modifier les appels de méthode. Ensuite, vous voudrez certainement éviter que l'interface utilisateur ralentisse chaque fois qu'une image est lue depuis SDCard (ou le Web). C'est à ce moment que vous devrez regarder à AsyncTask qui permet de déposer des images dans un fil de fond tout en laissant l'utilisateur interagir avec l'interface utilisateur (comme faire défiler plus rapidement même lorsque les images sont chargées).

Questions connexes