Xamarin Visual Studio:带有来自 url 的图像的 GridView

Xamarin Visual Studio: GridView with image from url

我正在使用 Visual Studio 和 Xamarin 插件开发可移植应用程序 (Xamarin.Forms).

我正在尝试使用来自 url 的图像创建一个 gridview,我正在遵循 GridView 的这个示例:

我尝试在 ImageAdapter 上替换,以下几行:

http://developer.xamarin.com/recipes/android/layout/grid_view/create_a_grid_view/

此示例与 /resources/drawables 上的图像完美配合,但我需要从 url 下载图像。

imageView.SetImageResource(thumbIds[position]);

Android.Net.Uri url = Android.Net.Uri.Parse("http://xamarin.com/resources/design/home/devices.png");
imageView.SetImageURI(url);

但不起作用。

请帮助我。

问题是 SetImageURI 只能与特定于 Android 操作系统的 URI 一起使用。当你给你的 imageView 互联网 url 它会尝试使用你给它的地址在你的 phone 本地找到图像,因此你会得到一个 "No such file or directory" 错误。

您需要做的是下载图像,然后使用 BitmapFactory 转换为 Android 位图。然后你用imageView.SetImageBitmap设置图片。

private Bitmap GetBitmapFromUrl(string url)
{
    using(WebClient webClient = new WebClient())
    {
        byte[] bytes = webClient.DownloadData(url);
        if(bytes != null && bytes.Length > 0)
        {
            return BitmapFactory.DecodeByteArray(bytes, 0, bytes.Length);
        }
    }
    return null;
}

将图像应用到 imageView

Bitmap bitmap = GetBitmapFromUrl("http://xamarin.com/resources/design/home/devices.png");
imageView.SetImageBitmap(bitmap);

这两种方法都有效,但异步执行是一种很好的做法。这里有一些很好的例子:

  1. Xamarin 中的异步图像加载 Android http://javatechig.com/xamarin/asynchronous-image-loading-xamarin-android
  2. xamarin-store-app 图像助手https://github.com/xamarin/xamarin-store-app/blob/master/XamarinStore.Droid/Helpers/Images.cs

还有一篇关于使用 RecyclerView 的好文章 "Xamarin Android - A Staggered Grid Layout, via a RecyclerView. And no Java bindings!" http://blog.wislon.io/posts/2015/03/05/xamarin-android-staggered-grid-layout/

只需替换行 viewHolder.Thumbnail.SetImageResource(Resource.Drawable.Icon); MyRecyclerAdapter.cs 的这样的事情:

  • 同步方法 var imageBitmap = Common.GetImageBitmapFromUrl(gridItem.UrlPhoto); viewHolder.Thumbnail.SetImageBitmap(imageBitmap);

  • Async 方法(使用 xamarin-store-app 中的 Image Helper 方法。记得在 main activity 上设置 FileCache.SaveLocation = CacheDir.AbsolutePath;) viewHolder.Thumbnail.SetImageFromUrlAsync(gridItem.UrlPhoto);