【问题标题】:Xamarin Visual Studio: GridView with image from urlXamarin Visual Studio:带有来自 url 的图像的 GridView
【发布时间】:2015-04-14 12:37:25
【问题描述】:

我正在使用 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);

但不工作。

请帮帮我。

【问题讨论】:

  • 它是否显示任何错误消息和/或应用程序输出(调试窗口)中是否有任何指示错误的内容?还要确保你设置了the internet permission for the android project
  • 感谢您的回复,我的应用程序有互联网权限,是的,显示错误消息:02-06 15:02:02.208 E/BitmapFactory( 2116): Unable to decode stream: java.io.FileNotFoundException: /http:/xamarin.com/resources/design/home/devices.png: open failed: ENOENT (No such file or directory)02-06 15:02:02.208 I/System.out( 2116): resolveUri failed on bad bitmap uri: http://xamarin.com/resources/design/home/devices.png

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


【解决方案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);

【讨论】:

  • 好的,这项工作,但您需要在 gridview 中使用x 照片,其中x 的长度为String Array[urls]。你能帮我解决这个问题吗?
  • 我不确定它是否适用于您的情况,但请考虑使用 RecyclerView 而不是 GridView 并使用 StaggeredGridLayoutManager 让图像以网格方式很好地排序,就像this
【解决方案2】:

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

  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。而且没有 Java 绑定!” 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 方法。记得在主要活动上设置 FileCache.SaveLocation = CacheDir.AbsolutePath;) viewHolder.Thumbnail.SetImageFromUrlAsync(gridItem.UrlPhoto);

【讨论】:

    猜你喜欢
    • 2012-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多