2015-02-06 75 views
0

我正在开发与Visual Studio和插件Xamarin (Xamarin.Forms)的便携式应用程序。Xamarin Visual Studio:GridView与url的图像

我试图创建从图像的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); 

,但不起作用。

请帮帮我。

+0

它显示任何错误消息和/或在应用程序输出(调试窗口)中是否有任何指示错误的内容?还要确保你已经设置了[Android项目的互联网许可](http://developer.xamarin.com/recipes/android/general/projects/add_permissions_to_android_manifest/) – arnfada 2015-02-06 14:56:38

+0

感谢您的回应,我的应用程序具有互联网许可,并且yes显示错误消息:'02-06 15:02:02.208 E/BitmapFactory(2116):无法解码流:java.io.FileNotFoundException:/http:/xamarin.com/resources/design/home/devices.png :打开失败:ENOENT(没有这样的文件或目录)'。 '02-06 15:02:02.208 I/System.out(2116):resolveUri在错误的位图上失败uri:http:// xamarin.com/resources/design/home/devices.png' – 2015-02-06 15:03:36

回答

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); 
+0

好的,这项工作,但是在gridview中需要'x'照片,其中'x'是'String Array [urls]'的长度。你能帮助我吗? – 2015-02-06 17:27:39

+0

我不确定它是否适用于您的情况,但考虑使用RecyclerView而不是GridView,并使用StaggeredGridLayoutManager以非常像网格方式订购图像的方式很像[this](https://www.youtube.com/看?v = yYsO_h6I_Hw) – arnfada 2015-02-10 09:05:43

0

两种方法的工作,但它是一个很好的做法,这样做是异步的。这里有一些很好的例子:在Xamarin的Android

  1. 异步图像加载http://javatechig.com/xamarin/asynchronous-image-loading-xamarin-android
  2. xamarin店 - 应用图像辅助https://github.com/xamarin/xamarin-store-app/blob/master/XamarinStore.Droid/Helpers/Images.cs

另外这里您在使用RecyclerView称为“Xamarin好文章Android - 一个交错的网格布局,通过一个RecyclerView,并且没有Java绑定!“ http://blog.wislon.io/posts/2015/03/05/xamarin-android-staggered-grid-layout/

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

  • Sync方法 变种imageBitmap = Common.GetImageBitmapFromUrl(gridItem.UrlPhoto); viewHolder.Thumbnail.SetImageBitmap(imageBitmap);

  • 异步方法(使用Image Helper方法从xamarin店内应用内记得设置FileCache.SaveLocation = CacheDir.AbsolutePath;上主活性) viewHolder.Thumbnail.SetImageFromUrlAsync(的GridItem。UrlPhoto);