2

我正在使用AsyncTask从远程服务器下载图像并将它们显示在ListView. 我正在使用这个博客来完成它,并且一切正常。

此博客中唯一的问题是在下载图像时会显示 ColorDrawable。但我想在下载图像时显示默认图像。就像在下面的附图中一样:

图像列表

在这里你可以看到:

  1. Taylor Loother 和 Oye Oye 的图片已经下载。
  2. 服务器上没有 Gopala Govinda 的图像,所以我没有从服务器上为他下载图像并显示默认图像。
  3. 对于 Hellboy,图像仍在下载中,因此彩色背景(细黑线)出现在他的名字旁边。我不想显示这条黑线。我想像在 Gopala Govinda 前面一样显示默认图像,直到图像没有从服务器加载到地狱男爵。

    有谁知道该怎么做?

4

4 回答 4

1

我认为您想要做的是让DownloadedDrawable类扩展BitmapDrawable而不是Drawable然后选择适当的超级构造函数之一来指定您的默认图像位图:

/**
 * A fake Drawable that will be attached to the imageView while the download is in progress.
 *
 * Contains a reference to the actual download task, so that a download task can be stopped
 * if a new binding is required, and makes sure that only the last started download process can
 * bind its result, independently of the download finish order.</p>
 */
private static class DownloadedDrawable extends BitmapDrawable {
    private final WeakReference<BitmapDownloaderTask> 
       bitmapDownloaderTaskReference;

    private DownloadedDrawable(BitmapDownloaderTask bitmapDownloaderTask,
       Resources resources, Bitmap bitmap) {
        super(resources, bitmap); // you'll have to provide these
        bitmapDownloaderTaskReference =
            new WeakReference<BitmapDownloaderTask>(bitmapDownloaderTask);
    }

    public BitmapDownloaderTask getBitmapDownloaderTask() {
        return bitmapDownloaderTaskReference.get();
    }
}
于 2012-09-13T15:39:31.300 回答
1

我使用以下开源库来管理 AsyncTasks 中的图像获取: GitHub 上的 UrlImageViewHelper

它具有在下载实际图像时显示“加载”图像的能力。

你可以使用这个库或者自己做类似的事情。

如果您是自己做的,那么当您ImageView最初充气时,请使用“加载”图像。然后在你的AsyncTask,一旦你的图像被下载,你可以通过覆盖的onPostExecute方法来修改这个视图AsnycTask(这个方法在 UI 线程上运行,所以你可以在这个方法中修改我们的视图)

于 2012-09-12T10:56:09.280 回答
0

ListAdapter您的活动中ListView,只需将默认图像放在ImageView.

例如,在 ListAdapter Activity 的 getView 中,您可以这样做:

public View getView(int position, View convertView, ViewGroup parent) {

    View vi=convertView;
    if(convertView==null)
    {
        vi = inflater.inflate(R.layout.productrow, null);
    }
    TextView text=(TextView)vi.findViewById(R.id.textViewRow);;
    ImageView imageView=(ImageView)vi.findViewById(R.id.productimage);
    TextView price=(TextView)vi.findViewById(R.id.price);


    ProductDetailModel model=productlist.get(position);

    String result=model.getp_Set();

    vi.setId(position);
    text.setText(Html.fromHtml(result));
    price.setText(" $ "+model.getp_R_Price());    

    // See here
    imageView.setImageResource(R.drawable.stub_id);

    return vi;
}
于 2012-09-12T10:53:40.357 回答
0

或者,您可以从这里使用 RemoteImageView https://github.com/kaeppler/ignition/wiki/Sample-applications

于 2012-09-12T10:48:33.530 回答