2014-02-05 63 views
0

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

根据绑定类型,此适配器应该使视图膨胀并设置图像资源。

我可以直接覆盖GetViewMvxAdapter

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通货膨胀...

回答

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加入的方法 - 只是增加了一个参数为默认Java方法为当前行的预选ItemTemplateId。这就是所谓的内GetView和它或者创建一个新的 - 如果你想整体,除了预定义的ItemTemplateId所有MvvmCross适配器的行为(一般从AXML local:MvxItemTemplate拿起结合

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

通过MvvmCross添加了一个方法来覆盖此查看或使用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) 

用于获取该有它的数据绑定的DataContext设置的DataContext从templateId膨胀(或convertView重复使用)视图的方法。

在内部为convertView重用该方法使用:

protected virtual void BindBindableView(object source, IMvxListItemView viewToUse) 

其简单套在DataContext上viewToUse到源。

和地方convertView不能再用这种方法的情况下使用:

protected virtual IMvxListItemView CreateBindableView(object dataContext, int templateId) 

返回其DataContext的一个全新的观点已设置。


你想重写哪个取决于你的用例......并从你的问题中的方法,我不确定你的用例是什么。

就我个人而言,我最常见的用例是对不同的对象使用不同的templateId。为了实现这个目标我通常会覆盖GetBindableView的东西,如:https://github.com/MvvmCross/MvvmCross-Tutorials/blob/master/Working%20With%20Collections/Collections.Droid/Views/PolymorphicListItemTypesView.cs#L42

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); 
    } 

您可以在“使用集合”样品中看到这