适用于MvxGridView的自定义适配器

时间:2014-02-05 12:21:29

标签: android xamarin mvvmcross

我必须为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的情况下处理通货膨胀......

1 个答案:

答案 0 :(得分:2)

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适配器行为,请覆盖它。

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

MvvmCross添加的方法 - 只为当前行的预选ItemTemplateId添加一个参数给默认的Java方法。如果要整体除了预定义的ItemTemplateId(通常从AXML local:MvxItemTemplate绑定中拾取

之外的所有MvvmCross适配器行为,请覆盖此项
  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设置为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设置为source。

对于无法重用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