【问题标题】:Custom Adapter for MvxGridViewMvxGridView 的自定义适配器
【发布时间】:2014-02-05 12:21:28
【问题描述】:

我必须为 MvxGridView 实现一个自定义适配器。

这个适配器应该根据绑定的类型,膨胀一个视图,并设置一个图像资源。

我可以只覆盖 MvxAdapter 中的 GetView 吗?

public override View GetView(int position, View convertView, ViewGroup parent)
{
    var inflater = (LayoutInflater)this.Context.GetSystemService(Context.LayoutInflaterService);
    var productNode = (ProductNode)this.GetRawItem(position);
    if (productNode.NodeType == ProductNodeType.Folder)
    {
        return inflater.Inflate(Resource.Layout.GridFolderItem, parent);
    }
    else
    {
        View documentItemView = inflater.Inflate(Resource.Layout.GridDocumentItem, parent);
        var imageView = documentItemView.FindViewById<MvxImageView>(Resource.Layout.GridFolderItem);

        switch (productNode.NodeType)
        {
            case ProductNodeType.Unknown:
                throw new InvalidOperationException("Node type hasn't been initialized");

            case ProductNodeType.Image:
                // Set matching image
                break;
            case ProductNodeType.Pdf:
                break;
            case ProductNodeType.Parts:
                break;

            default:
                throw new InvalidOperationException(
                    string.Format("Unhandled node type '{0}'", productNode.NodeType));
        }

        return imageView;
    }
}

或者我应该覆盖 GetBindableView 吗?

在这种情况下,如果没有父 ViewGroup,我真的不知道如何处理通货膨胀......

【问题讨论】:

    标签: android xamarin mvvmcross


    【解决方案1】:

    MvxAdpater 的来源在https://github.com/MvvmCross/MvvmCross/blob/v3.1/Cirrious/Cirrious.MvvmCross.Binding.Droid/Views/MvxAdapter.cs

    GetView 方法基本上是:

     public override View GetView(int position, View convertView, ViewGroup parent)
    

    Java ListView 调用的方法。如果您想覆盖所有 MvvmCross Adapter 行为,请覆盖它。

     protected virtual View GetView(int position, View convertView, ViewGroup parent, int templateId)
    

    由 MvvmCross 添加的方法 - 只是为当前行的预选 ItemTemplateId 的默认 Java 方法添加一个参数。如果您想要整体所有 MvvmCross 适配器行为,除了预定义的 ItemTemplateId (通常从 AXML local:MvxItemTemplate 绑定中获取),请覆盖它

      protected virtual View GetBindableView(View convertView, object dataContext, int templateId)
    

    由 MvvmCross 添加的方法 - 在 GetView 中调用它,它要么创建一个新视图,要么使用 convertView,然后确保绑定具有正确的 DataContext 集。如果你想替换 MvvmCross 获取列表项视图并将它们绑定到它们的数据上下文的方式,请覆盖它。

    protected virtual void BindSimpleView(View convertView, object dataContext)
    protected virtual View GetSimpleView(View convertView, object dataContext)
    

    当提供零ItemTempateId(即没有模板)时,用于创建和绑定视图的两种方法。在这种情况下,我们通常假设显示一个简单的TextView,然后将其Text OneTime 设置为DataContext 的ToString。如果您有一些特别的事情想要做而不使用 ItemTemplate 的,请覆盖它

    protected virtual View GetBindableView(View convertView, object dataContext, int templateId)
    

    用于获取从 templateId 膨胀(或从 convertView 重用)的视图的方法,它的数据绑定 DataContext 设置为 dataContext。

    内部为convertView重用此方法使用:

    protected virtual void BindBindableView(object source, IMvxListItemView viewToUse)
    

    简单地将viewToUse 上的 DataContext 设置为源。

    对于不能重用convertView 的情况,此方法使用:

    protected virtual IMvxListItemView CreateBindableView(object dataContext, int templateId)
    

    返回一个已经设置了 DataContext 的全新视图。


    您要覆盖的内容取决于您的用例...并且从您的问题中的方法来看,我不确定您的用例是什么。

    就个人而言,我最常见的用例是对不同的对象使用不同的 templateId。为了实现这一点,我通常用类似的东西覆盖GetBindableView

      protected override View GetBindableView(View convertView, object dataContext, int templateId)
      {
          if (SomePredicate(dataContext))
                templateId = Resource.Layout.ListTemplateId1;
          else if (SomeOtherPredicate(dataContext))
                templateId = Resource.Layout.ListTemplateId2;
          else if (SomeOtherOtherPredicate(dataContext))
                templateId = Resource.Layout.ListTemplateId3;
    
          return base.GetBindableView(convertView, dataContext, templateId);
      }
    

    您可以在“使用集合”示例中看到这一点:https://github.com/MvvmCross/MvvmCross-Tutorials/blob/master/Working%20With%20Collections/Collections.Droid/Views/PolymorphicListItemTypesView.cs#L42

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-13
      • 1970-01-01
      • 2023-03-22
      • 1970-01-01
      相关资源
      最近更新 更多