MvvmCross:基于片段的选项卡视图中的多态列表

时间:2013-07-27 14:16:09

标签: android fragment mvvmcross

我正在尝试创建一个使用基于片段的TabView的GUI。该代码基于MvvmCross教程中的FragmentSample。 TabView中的选项卡数量取决于从xml文件读取的数据,每个选项卡使用相同的片段。到目前为止一切正常。当我尝试向片段添加多态列表时,问题就出现了。用于创建多态列表的代码与Collection示例中的代码基本相同(同样来自MvvmCross教程)。

首先,我尝试创建列表适配器并将其分配给与TabView关联的Activity中的MvxListView(扩展MvxTabsFragmentActivity的类)。在该类中,我重写了OnViewModelSet()方法。在覆盖中,我创建了一个ListAdapter,它扩展了MvxAdapter并将其分配给列表。问题是适配器中的GetBindableView(View convertedView,object dataContext,int templateId)方法永远不会被调用,因此通过对绑定到列表的项调用ToString()方法来显示列表中的所有项。也许值得一提的是,如果我在.axml文件中定义DataTemplate,列表工作正常 - 但不是多态的。

然后我尝试将用于创建ListAdapter的代码移动到与片段相关联的类 - 从MvxFragment派生的代码 - 这似乎更好,因为列表位于片段内。因为我不确定要覆盖哪个方法,所以我首先尝试了OnAttach方法,该方法在异常中产生了说,此时无法使用BindingContext。当我把代码放在片段的Resume()方法中时,事情终于开始起作用了。对于创建适配器时所需的Context实例,我只使用了base.Activity。

最后我的问题。上面描述的解决方案是否正确 - OnResume()方法是创建列表适配器的方法,还是我应该使用一些不同的方法。正如我所说 - 一切似乎都工作正常我只是不确定这是否是最好(好)的解决方案。

我希望这篇文章不会冗长 - 我试图在不遗漏重要细节的情况下尽可能简短。任何建议将不胜感激。

乌罗什

2 个答案:

答案 0 :(得分:1)

我认为我并没有完全理解你试图初始化的地方,也不知道你分配给哪些活动,片段和列表的视图模型。

但是,作为一个基本答案,我通常希望您创建listview,并且它是在片段的OnCreateView创建中的适配器 - 这发生在onAttach之后。

在Mvx源代码中,我们尝试创建Fragment的BindingContext - 请参阅https://github.com/slodge/MvvmCross/blob/v3/Cirrious/Cirrious.MvvmCross.Droid.Fragging/Fragments/MvxBindingFragmentAdapter.cs#L32

我认为可能可以使用OnResume - 但您可能会发现,对于给定的已创建片段视图,可以多次调用它 - 例如如果当前拥有的活动暂停然后恢复,您将被调用。因此,如果您选择覆盖OnCreateView

,我认为您可能会更成功

Fragment生命周期需要掌握很多东西 - 特别是因为它与Activity生命周期不同(片段可以比他们生活的活动更长寿命)

关于http://developer.android.com/guide/components/fragments.html的文档是一个良好的开端 - 包括这张图片:

Android Fragment lifecycle

答案 1 :(得分:1)

是的,就像Stuart提到的那样,最好在OnCreateView()方法中做到这一点。

我设法做到这样:

public override View OnCreateView (LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
    base.OnCreateView (inflater, container, savedInstanceState);
    View fragmentView = this.BindingInflate(Resource.Layout.View_Applications, null);
    var list = fragmentView.FindViewById<MvxListView>(Resource.Id.TheListView);
    list.Adapter = new HeaderAdapter(Activity, (IMvxAndroidBindingContext) BindingContext);
    return fragmentView;
}

有关详细信息,请查看Stuart's example with collections