1

我正在 MVVMCross 的 Android 应用程序中创建收藏夹汽车列表。我的问题是该列表上的动态加载图像。我的观点是,每辆车的 ImageView 正在获取转换器获取并返回 BitmapDrawable 对象的图片 ID。它在我的 Windows Phone 应用程序上运行,但在 Android 中我有一个小问题。代码如下所示:

<LinearLayout
      android:id="@+id/PeoplePanel"
      android:orientation="horizontal"
      android:layout_width="fill_parent"
      android:layout_height="wrap_content"
      android:background="@color/transparent"
      android:layout_below="@id/TitleTextView"
      android:paddingTop="3dip"
      android:paddingLeft="10dip">
    <ImageView
        android:id="@+id/imagePhoto"
        android:layout_width="70dp"
        android:layout_height="70dp"
        local:MvxBind="{'ResourcesImagePath':{'Path':'Item.Obj.IDZdjeciaGlownego', 'Converter':'ByteToImg'}}"/>

转换器是:

public override object Convert(object value, Type targetType, object parameter, CultureInfo culture)
            {
                var id = (int?)value;
                if (id != null)
                {
                    var Service = this.GetService<IKomisSamService>();
                    var img = Service.GetImage((int)id);
                    try
                    {                
                        var drawable = BitmapFactory.DecodeByteArray(img, 0, img.Length);
                        return new BitmapDrawable(drawable);
                    }
                    catch { }
                }
                return null;

..和输出:

04-12 11:13:06.034 I/MvxBind (  856): 135.42 Failed to create target binding for from Item.Obj.IDZdjeciaGlownego to ResourcesImagePath
MvxBind:Warning:135.42 Failed to create target binding for from Item.Obj.IDZdjeciaGlownego to ResourcesImagePath
04-12 11:13:06.034 I/mono-stdout(  856): MvxBind:Warning:135.42 Failed to create target binding for from Item.Obj.IDZdjeciaGlownego to ResourcesImagePath
04-12 11:13:06.644 D/dalvikvm(  856): GC_EXTERNAL_ALLOC freed 1850 objects / 93880 bytes in 48ms

转换器运行两次:第一次要求服务获取项目,下载时第二次运行以获取并返回 BitmapDrawable 对象。

我假设我的问题出在 MvxBind 中,我不应该使用 ResourcesImagePath 而是其他获取 BitmapDrawable 对象而不是他的路径的东西。提前致谢!

4

1 回答 1

2

一般来说:

  • MvvmCross 中有“内置”绑定,用于显示来自资产和ImageViews内资源的图像
  • MvxImageView使得显示下载的图像非常简单 - 只需使用ImageUrl并确保您已加载 DownloadCache 和 File 插件。
  • 在 v3 中,还有一个现成的绑定可用于在 sByte[]内部显示ImageView(这是在 PictureChooser 插件中)

但是,对于您想要添加自己的绑定的一般情况,如果您愿意,您可以自己执行此操作...

但是你不能仅仅通过发明ResourcesImagePath和使用价值转换器来做到这一点。AnImageView没有ResourcesImagePath属性——所以在这种情况下 Mvx 系统没有什么可以绑定的。

反而:

  1. 您需要使用如下类定义绑定操作:https ://github.com/slodge/MvvmCross/blob/vnext/Cirrious/Cirrious.MvvmCross.Binding.Droid/Target/MvxImageViewDrawableTargetBinding.cs

  2. 然后您需要(在您的 期间Setup)告诉 mvvmcross 如何使用该绑定 - 例如第 63 行:https ://github.com/slodge/MvvmCross/blob/vnext/Cirrious/Cirrious.MvvmCross.Binding.Droid /MvxAndroidBindingBuilder.cs#L63

这样做称为“创建自定义绑定”


注意:我不完全确定“转换器正在运行两次”-不确定您的意思是什么(听起来像是一个单独的问题)


重要提示 - 为避免位图内存泄漏,请对您动态加载的所有位图使用 InPurgeable

于 2013-04-12T11:55:40.750 回答