1

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

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

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

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

我希望这篇文章不要太长——我尽量简短而不遗漏重要细节。任何建议将被认真考虑。

乌鲁斯

4

2 回答 2

1

我认为我没有完全理解你试图在哪里初始化什么,也没有完全理解你分配给哪个活动、片段和列表的视图模型。

但是,作为一个基本答案,我通常希望您在创建OnCreateView片段时创建您的列表视图和它的适配器 - 这发生在 onAttach 之后。

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

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

Fragment 生命周期有很多东西要掌握 - 特别是因为它与 Activity 生命周期不同(Fragment 可以并且确实比它们所在的 Activity 寿命更长)

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

Android 片段生命周期

于 2013-07-28T16:08:55.020 回答
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 的带有集合的示例以获取更多详细信息。

于 2014-04-01T14:17:37.137 回答