2010-12-12 19 views
7

Al desplazar mi lista de lista con imágenes. Las imágenes desaparecerán y luego reaparecerán un segundo o dos más tarde. ¡Cualquier ayuda en el asunto sería apreciada!Las imágenes de la lista de Android desaparecen al desplazarse

Esto está en mi getView que exige el código de abajo:

 image_main.setImageBitmap(null); 
     if (curr == 0 && image != null) { 

      list_image.setVisibility(View.VISIBLE); 
      image_preference = preferences.getString("image_preferences", "false"); 
      time_right.setVisibility(View.GONE); 
      if (image_preference.equals("false")) { 
       ImageDownloader imgDwn = new ImageDownloader(); 
       imgDwn.download(image, image_main, image_table); 
      } 

Mi código:

public class ImageDownloader { 

    public void download(String url, ImageView imageView, TableLayout imageTable) { 
     if (cancelPotentialDownload(url, imageView)) { 
     BitmapDownloaderTask task = new BitmapDownloaderTask(imageView, imageTable); 
     DownloadedDrawable downloadedDrawable = new DownloadedDrawable(task); 
     imageView.setImageDrawable(downloadedDrawable); 
     task.execute(url); 
     } 
    } 

    class BitmapDownloaderTask extends AsyncTask<String, Void, Bitmap> { 
     String url; 
     private final WeakReference<ImageView> imageViewReference; 
     private final WeakReference<TableLayout> imageTableReference; 

     public BitmapDownloaderTask(ImageView imageView, TableLayout imageTable) { 
      imageViewReference = new WeakReference<ImageView>(imageView); 
      imageTableReference = new WeakReference<TableLayout>(imageTable); 
     } 

      @Override 
      protected Bitmap doInBackground(String... params) { 
       BitmapFactory.Options o = new BitmapFactory.Options(); 
        o.inJustDecodeBounds = true; 
        BitmapFactory.decodeFile(params[0], 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=4; 
        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(params[0], o2); 
      } 

      @Override 
      protected void onPostExecute(Bitmap result) { 
       if (isCancelled()) { 
        result = null; 
       } 

       if (imageViewReference != null) { 
        ImageView imageView = imageViewReference.get(); 
        TableLayout imageTable = imageTableReference.get(); 
        BitmapDownloaderTask bitmapDownloaderTask = ImageDownloader.getBitmapDownloaderTask(imageView); 
        // Change bitmap only if this process is still associated with it 
        if (this == bitmapDownloaderTask) { 
          imageView.setImageBitmap(result); 
          imageView.setVisibility(View.VISIBLE); 
          imageTable.setVisibility(View.VISIBLE); 
        }    
       } 
      } 
    } 

    static class DownloadedDrawable extends ColorDrawable { 
     private final WeakReference<BitmapDownloaderTask> bitmapDownloaderTaskReference; 

     public DownloadedDrawable(BitmapDownloaderTask bitmapDownloaderTask) { 
      super(Color.BLACK); 
      bitmapDownloaderTaskReference = 
       new WeakReference<BitmapDownloaderTask>(bitmapDownloaderTask); 
     } 

     public BitmapDownloaderTask getBitmapDownloaderTask() { 
      return bitmapDownloaderTaskReference.get(); 
     } 
    } 

    private static boolean cancelPotentialDownload(String url, ImageView imageView) { 
     BitmapDownloaderTask bitmapDownloaderTask = getBitmapDownloaderTask(imageView); 

     if (bitmapDownloaderTask != null) { 
      String bitmapUrl = bitmapDownloaderTask.url; 
      if ((bitmapUrl == null) || (!bitmapUrl.equals(url))) { 
       bitmapDownloaderTask.cancel(true); 
      } else { 
       // The same URL is already being downloaded. 
       return false; 
      } 
     } 
     return true; 
    } 

    private static BitmapDownloaderTask getBitmapDownloaderTask(ImageView imageView) { 
     if (imageView != null) { 
      Drawable drawable = imageView.getDrawable(); 
      if (drawable instanceof DownloadedDrawable) { 
       DownloadedDrawable downloadedDrawable = (DownloadedDrawable)drawable; 
       return downloadedDrawable.getBitmapDownloaderTask(); 
      } 
     } 
     return null; 
    } 
} 

Respuesta

0

Bueno Paul por lo que el código se refiere a que está descargando las imágenes cada vez de la deseada servidor cada vez que se desplaza por la vista de lista. Probablemente una implementación de caché de mapa de bits podría resolver su problema.

+1

En realidad, mis imágenes están en la tarjeta SD. Estaba probando este código que encontré en el blog de desarrollo de Android y nunca me molesté en cambiar los nombres todavía. – Paul

4

Descubrí el problema leyendo question. Si oculta algunos elementos, debe mostrarlos de nuevo :) así de simple.

Cuestiones relacionadas