我必须为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的情况下处理通货膨胀......
答案 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
绑定中拾取
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