繁体   English   中英

Android ListView ImageView沮丧

[英]Android listview imageview frustration

我已经为此困扰了很长时间,但仍然没有解决方案。 我正在通过asynctask填充listview图像,并且在填充方面效果很好,但是问题是,当我滚动列表时,图像消失了一两秒,然后重新出现。 请注意,所有图像都在我的SD卡上,没有下载任何内容。 我只是调整了Android开发者博客中的代码,而从未重命名它。 我的getView的相关部分如下所示:

image =图像文件的路径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;
}

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM