2011-07-07 8 views
0

J'ai une ListActivity qui lance une tâche pour frapper un service Web et afficher les résultats dans un ListView. Chacun des résultats a un identifiant d'image attaché à celui-ci.Les images dans la listeVoir les résultats de la recherche

J'ai écrit une méthode qui va obtenir les ID d'image des lignes affichées à l'écran (firstVisiblePosition() à lastVisiblePosition()) et lancer une tâche pour interroger un autre service Web pour obtenir les images à afficher pour ces éléments. J'appelle cette méthode lorsque l'état de défilement de la liste devient SCROLL_STATE_IDLE. Cela permet à l'utilisateur de faire défiler la tâche pour que les images des lignes visibles ne s'exécutent que lorsque le défilement s'arrête, ce qui l'empêche de rechercher des images pour les lignes hors écran. Mon problème est que lorsque les résultats montrent initialement dans le ListView, je ne peux pas trouver un bon moyen d'appeler ma méthode pour rechercher les ID d'image à interroger. Apparemment, appeler cette méthode juste après avoir appelé setAdapter ne fonctionne pas (je suppose que certains travaux de ListView se déroulent de manière asynchrone). J'utilise plusieurs adaptateurs (pour des raisons qui ne sont pas pertinentes pour cet article), j'ai donc besoin d'un bon moyen d'attendre que les éléments de la liste s'affichent avant que j'appelle ma méthode pour obtenir les ID.

Des idées?

Répondre

1

Une fois que vous avez défini l'adaptateur ou appelé notifyDatasetChanged() sur l'adaptateur, ajoutez votre code « charge d'images » à la file d'attente de poste de la liste comme Runnable:

list.post(new Runnable() { 
    @Override 
    public void run() { 
    //do stuff 
    } 
    }); 
+0

Impressionnant. Je vous remercie. – Andrew

+0

Si cela vous intéresse, j'ai fait la même chose que vous, et j'ai trouvé que 'SCROLL_STATE_IDLE' n'était pas aussi précis que je le voudrais, alors j'ai implémenté quelque chose de plus sophistiqué. J'ai posté cela comme une réponse précédemment [ici] (http://stackoverflow.com/questions/6358428/implementation-of-onscrolllistener-to-detect-the-end-of-scrolling-in-a-listview/6358818#6358818). – dmon

0

Si je comprends bien votre question, vous rencontrez des problèmes pour charger les images sur le réseau et les problèmes de performances; le cas échéant,

je créer un simple cache d'image dans mon adaptateur comme une HashMap locale mais mondiale:

 
private HashMap&ltString, Drawable> imgCache = new HashMap&ltString, Drawable>(); 

puis dans ma méthode getView(), je en mode asynchrone (avec un fil et un gestionnaire) charge les images et enregistre les images chargées dans mon imgCache en affectant la position en tant que clé et les images chargées en tant que Drawables.

 
final Handler h = new Handler() { 
    public void handleMessage(Message msg) { 
     if(msg.obj != null) { 
      Drawable drawable = (Drawable)msg.obj; 
      image.setImageDrawable(drawable); 
      image.postInvalidate(); 
      image.requestLayout(); 
      imgCache.put(cacheKey, drawable); 
     } 
    } 
}; 
loadImage(myImageView, imageURL, h); // threaded method which loads the images from net 

aussi, dans ma méthode getView() Je voudrais tout d'abord demander imgCache voir si l'image existe déjà avant loadImage est appelée.

Cela devrait optimiser votre liste et vous sauver d'utiliser l'adaptateur multiple, etc.

Hope this helps,

-serkan

+0

J'ai fait tout cela. Le problème est l'utilisation de getView() chargera TOUTES les images de la liste si vous faites défiler du haut vers le bas. C'est une perte de temps et de mémoire. Il devrait seulement essayer de chercher les images que l'utilisateur peut voir. Donc, j'ai déplacé le code de getView à onScrollChanged. – Andrew

Questions connexes