2010-12-16 8 views
1

私はまだ解決策がないのに、このことについて長い間混乱してきました。私はasynctaskを介してリストビューの画像を取り込んでいますが、それは表示されますが、問題は、リストをスクロールすると画像が2〜2回消えて再び表示されることです。注意してください、すべての画像は私のSDカードには、何もダウンロードされていません。 Android Devブログからコードを調整して名前を変更したことはありません。Androidのリストビュー画像ビューのフラストレーション

: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); 
      } 

それはこのようになります処理するクラスを保持している=表の画像ファイル image_main = ImageViewの image_tableへ

画像= PATH:私のgetViewメソッドの関連部分はこのようになります

パブリッククラス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; 
} 

}

答えて

関連する問題