2010-12-16 4 views
1

Я давно общаюсь с этим, пока еще нет решения. Я заполняю изображения списков с помощью asynctask, и он отлично работает с точки зрения заполнения, но проблема в том, что при прокрутке списка изображения исчезают на секунду или два, а затем снова появляются. Обратите внимание: ВСЕ изображения находятся на моей SD-карте, ничего не загружено. Я только что скорректировал код из Android dev blog и никогда не переименовал его. Соответствующая часть моего GetView выглядит следующим образом:Android listview imageview frustration

изображения = путь к файлу изображения image_main = ImageView image_table = Таблица, которая содержит ImageView

   list_image.setVisibility(View.VISIBLE);     
       ImageDownloader imgDwn = new ImageDownloader(); 
       imgDwn.download(image, image_main, image_table); 
      } else { 
       list_image.setVisibility(View.GONE); 
       image_table.setVisibility(View.GONE); 
       image_main.setImageBitmap(null); 
      } 

класс, который обрабатывает это выглядит следующим образом:

класс 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; 
} 

}

ответ

Смежные вопросы