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

时间:2015-02-06 14:53:57

标签: c# visual-studio-2012 gridview xamarin android-gridview

我正在使用Visual Studio和Xamarin插件开发便携式应用程序 (Xamarin.Forms)。

我尝试使用来自网址的图片创建网格视图,我按照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);

但不能工作。

请帮帮我。

2 个答案:

答案 0 :(得分:1)

问题是SetImageURI只能用于特定于Android操作系统的URI。当您提供imageView互联网网址时,它会尝试使用您提供的地址在本地查找手机上的图像,因此您会收到“没有此类文件或目录”错误。

您需要的是下载图像,然后使用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 :(得分:0)

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

  1. Xamarin Android中的异步图像加载http://javatechig.com/xamarin/asynchronous-image-loading-xamarin-android
  2. xamarin-store-app image helper https://github.com/xamarin/xamarin-store-app/blob/master/XamarinStore.Droid/Helpers/Images.cs
  3. 此外,您还可以通过RecyclerView获得一篇关于使用RecyclerView的文章,该文章名为" Xamarin Android - 交错网格布局。并且没有Java绑定!" http://blog.wislon.io/posts/2015/03/05/xamarin-android-staggered-grid-layout/

    只需替换line viewHolder.Thumbnail.SetImageResource(Resource.Drawable.Icon); MyRecyclerAdapter.cs的内容如下:

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

    • 异步方法(使用xamarin-store-app中的Image Helper方法。请记住在主要活动上设置FileCache.SaveLocation = CacheDir.AbsolutePath; viewHolder.Thumbnail.SetImageFromUrlAsync(gridItem.UrlPhoto);