MvxListItemView从MvvmCross 4.2.3迁移到5.1.1

时间:2017-08-07 13:35:48

标签: c# android xamarin.android mvvmcross

我目前正在升级我的应用程序以使用最新版本的MvvmCross(5.1.1)。它之前使用的是4.2.3。

到目前为止,我遇到的唯一问题是使用从MvxListItemView派生的类。

在我的代码中,我有一个适用于我的CustomListItemView的适配器。在我的适配器的GetView覆盖中,我尝试将传入的视图转换为我的CustomListItemView类型,例如

public overrride View GetView(int position, View convertView, ViewGroup parent)
{
    if (convertView is CustomListItemView)
    {
        // do something
        CustomListItemView myCustomListItemView = (CustomListItemView) convertView;
    }
    else
    {
        // do something else
    }
}

我收到以下错误

Cannot convert type 'Android.Views.View' to 'MyNameSpace.CustomListItemView'

此外,如果我尝试在CustomListItemView中使用FindViewById,则说

'CustomListItemView' does not contain a definition for 'FindViewById'

这曾用于4.2.3

好像MvxListView不再是从View派生的 有什么想法吗?

1 个答案:

答案 0 :(得分:0)

MvvmCross 5.x中的MvxListView,我认为4.x版晚期也使用了ViewHolder模式。所以MvxListViewItem已经从View变为ViewHolder。

因此,您不想夸大自己的观点等,而是想做类似的事情:

public class CustomAdapter : MvxAdapter
{
    public CustomAdapter(Context context) : base(context)
    {
    }

    public CustomAdapter(Context context, IMvxAndroidBindingContext bindingContext) : base(context, bindingContext)
    {
    }

    public CustomAdapter(IntPtr javaReference, JniHandleOwnership transfer) : base(javaReference, transfer)
    {
    }

    protected override View GetBindableView(View convertView, object dataContext, ViewGroup parent, int templateId)
    {
        if (dataContext is ViewModelA)
        {
            templateId = Resouce.Layout.item_a;
        }
        else if (dataContext is ViewModelB)
        {
            templateId = Resouce.Layout.item_b;
        }

        return base.GetBindableView(convertView, dataContext, parent, templateId);
    }
}

如果base.GetBindableView是错误的模板,内置的convertView会处理剩下的事情,它会创建一个新的ViewHolder等。