2016-06-19 13 views
2

私は複数のアイテムからなるリストビューを持っています。リスト内の各アイテムには、関連付けられたイメージが必要です。私は、各リスト項目を保持し、ロードしたい画像のURLを持つ配列アダプタを作成しました。Xamarin AndroidのImageViewにURLから非同期に画像をロードする

私は、Webリクエストを使用してイメージを非同期的にロードしようとしていますが、イメージがロードされた後にイメージを設定してビューに更新しようとしていますが、ビューはimmediatlyデフォルトイメージでレンダリングする必要があります。ここで

は、私はそうのように、私は私のHttpClientを初期化していた画像

private async Task<Bitmap> GetImageBitmapFromUrl(string url, ImageView imageView) 
{ 
    Bitmap imageBitmap = null; 

    try 
    { 
     var uri = new Uri(url); 
     var response = httpClient.GetAsync(uri).Result; 

     if (response.IsSuccessStatusCode) 
     { 
      var imageBytes = await response.Content.ReadAsByteArrayAsync(); 
      if (imageBytes != null && imageBytes.Length > 0) 
      { 
       imageBitmap = BitmapFactory.DecodeByteArray(imageBytes, 0, imageBytes.Length); 
       imageView.SetImageBitmap(imageBitmap); 
      } 
     } 
    } 
    catch (Exception e) 
    { 
     Console.WriteLine(e); 
    } 

    return imageBitmap; 
} 

をロードしようとするために使用しています方法です:

httpClient = new HttpClient(); 
httpClient.Timeout = new TimeSpan(0, 0, 10); 
httpClient.MaxResponseContentBufferSize = 256000; 

そして、ここでは私がGetImageFromUrlメソッドを呼び出しています方法です

ImageView myImage = convertView.FindViewById<ImageView>(Resource.Id.AsyncImageView) 
myImage.SetImageBitmap(null); 
string url = GetItem(position); 
GetImageBitmapFromUrl(url, myImage); 

このコードを使用すると、要求は最終的に悪い要求で返されますが、私が使用しているURLをブラウザウィンドウに貼り付けると、期待しているイメージが表示されます。

答えて

6

イメージのダウンロードには注意する必要はありません。

Xamarin.AndroidImageView asyncに画像をロードする2つのライブラリがあります。

Picasso componentsource)用法:

Picasso.With(context) 
     .Load("http://i.imgur.com/DvpvklR.png") 
     .Into(imageView); 

FFImageLoadingsource)使用方法:(ドキュメントから)

ImageService.Instance.LoadUrl(urlToImage).Into(_imageView); 

注:

ピカソとは異なりますが、標準でFFImageLoadingを使用することはできませんImageViews。 ImageViewAsyncインスタンスにイメージをロードするだけです。 ImageViewAsyncは ImageViewから継承されるため、コードを更新するのは簡単です。

+1

私はピカソのソリューションを使いました。迅速な対応をありがとう! –

+0

ナゲットは正方形です。ピカソ – smedasn

関連する問題