2009-12-15 4 views
0

J'utilise listview pour afficher des données, dans listview j'utilise l'image dans chaque liste.ListItem lazyload Problème d'affichage d'image AsyncTask

Je suivais ce tutoriel http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/List4.html

new Handler().post(new Runnable(){ 

       @Override 
       public void run() { 
        //Need to subclass to use Asynctask 
        class DownloadImage extends AsyncTask<Void, Void, Void>{ 
         @Override 
         protected Void doInBackground(Void... params) { 
           Drawable dImage = Util.getImageFromURL(imageURL); 
            getImageIcon().setImageDrawable(dImage); 
          return null; 
         } 

        } 
        new DownloadImage().execute(); 
       } 

      }); 

cela semble bon pour l'image de chargement lazzy, mais il y a un problème, il ne sera pas afficher une image jusqu'à ce que l'écran tactile de l'utilisateur ou d'essayer de faire défiler les résultats ou toute interaction par l'utilisateur pour combiner les touches de l'appareil.

Si j'essaie de faire défiler les résultats, il affiche toutes les images de la liste ... ce qui peut mal tourner ???

Répondre

1

C'est difficile à dire sans plus de contexte. En particulier, d'où vient ce code, et que fait getImageIcon()?

Un problème que je vois est que vous définissez l'icône d'image dans un thread d'arrière-plan plutôt que dans le thread UI. Cela pourrait être la raison pour laquelle cela ne semble pas changer jusqu'à ce qu'un événement ui déclenche un rafraîchissement. Essayez de changer DownloadImage à quelque chose comme le suivant:

class DownloadImage extends AsyncTask<Void, Void, Drawable>{ 
     @Override 
     protected Drawable doInBackground(Void... params) { 
      return Util.getImageFromURL(imageURL); 
     } 

     @Override 
     protected void onPostExecute(Drawable d) { 
      getImageIcon().setImageDrawable(d); 
     } 

} 
new DownloadImage().execute(); 

Si j'ai raison, cela devrait régler le problème.

Si cela fonctionne, excellent, même si je pense que votre code pourrait utiliser un peu de nettoyage. Pourvu que tout cela se passe dans le thread d'interface utilisateur (ce qui est probablement vrai étant donné que vous instanciez un nouveau gestionnaire dans ce thread), vous ne devriez pas du tout utiliser un gestionnaire, ni créer un nouveau gestionnaire. Runnable. Supprimez-les et créez directement une nouvelle instance de DownloadImage et appelez execute().