2010-11-25 4 views
1

Mon application contient un listview qui peut éventuellement contenir des images d'une carte SD d'utilisateur. Cela fonctionne bien cependant quand n'importe quelle image est chargée, il y a un décalage notable. J'ai ceci dans mon getView:Android listview image lag

  BitmapFactory.Options o = new BitmapFactory.Options(); 
      o.inJustDecodeBounds = true; 
      BitmapFactory.decodeFile(image, o); 
      final int REQUIRED_SIZE=70; 

      //Find the correct scale value. It should be the power of 2. 
      int width_tmp=o.outWidth, height_tmp=o.outHeight; 
      int scale=1; 
      while(true){ 
       if(width_tmp/2<REQUIRED_SIZE || height_tmp/2<REQUIRED_SIZE) 
        break; 
       width_tmp/=2; 
       height_tmp/=2; 
       scale++; 
      } 

      //Decode with inSampleSize 
      BitmapFactory.Options o2 = new BitmapFactory.Options(); 
      o2.inSampleSize=scale; 
      Bitmap myBitmap = BitmapFactory.decodeFile(image, o2); 
      image_main.setImageBitmap(myBitmap); 

Des suggestions?

EDIT: Remplacée ci-dessus avec cela, mais pas chargement des images ...

  class Thumbnailer extends AsyncTask<String, Void, Bitmap> { 
        String image; 

        @Override 
        protected void onPostExecute(Bitmap result) { 
         image_main.setImageBitmap(result); 
        } 
        @Override 
        protected void onProgressUpdate(Void... progress) { 
        } 

        @Override 
        protected Bitmap doInBackground(String... params) { 
         BitmapFactory.Options o = new BitmapFactory.Options(); 
         o.inJustDecodeBounds = true; 
         BitmapFactory.decodeFile(image, o); 
         final int REQUIRED_SIZE=70; 

         //Find the correct scale value. It should be the power of 2. 
         int width_tmp=o.outWidth, height_tmp=o.outHeight; 
         int scale=1; 
         while(true){ 
          if(width_tmp/2<REQUIRED_SIZE || height_tmp/2<REQUIRED_SIZE) 
           break; 
          width_tmp/=2; 
          height_tmp/=2; 
          scale++; 
         } 
         //Decode with inSampleSize 
         BitmapFactory.Options o2 = new BitmapFactory.Options(); 
         o2.inSampleSize=scale;         
         return BitmapFactory.decodeFile(image, o2); 
        } 
       } 
       new Thumbnailer().execute(image); 

Répondre

2

Afficher la ligne avec une image d'espace réservé. Est-ce que votre BitmapFactory fonctionne dans un AsyncTask, mettant à jour le ImageView lorsque vous avez terminé (si le ImageView n'a pas été recyclé et a donc toujours besoin de cette vignette particulière). Cachez votre travail pour ne plus avoir à refaire toute la mise à l'échelle, du moins pour cette incarnation du ListView, peut-être plus longtemps si les images ne changent pas.

+0

Merci pour la réponse..J'essaie avec AsyncTask mais je n'arrive pas à le faire fonctionner..J'ai mis à jour mon 1er message pour vous montrer ce que j'ai fait. Je n'ai jamais joué avec AsyncTask donc je peux le faire incorrectement. Je suis à peu près débutant ici;) – Paul

+0

@ Paul: Il est difficile d'aider les gens qui refusent de dire ce que "ne peut pas le faire fonctionner" signifie. Autant que je sache, vous essayez de charger chaque image dans un seul widget 'ImageView', ce qui semble peu probable. Vous devez passer dans 'AsyncTask' le' ImageView' pour la ligne que vous traitez avec cette tâche particulière. – CommonsWare

+0

Je pense que le problème est que je n'utilise pas la chaîne d'image que je passe à l'inBackground – Paul