【问题标题】:MvvmCross: Polymorphic list within fragment based tab viewMvvmCross:基于片段的选项卡视图中的多态列表
【发布时间】:2014-04-01 22:17:37
【问题描述】:

我正在尝试创建一个使用基于片段的 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() 方法是创建列表适配器的方法还是我应该使用一些不同的方法。正如我所说 - 一切似乎都正常我只是不确定这是否是最好的(好的)解决方案。

我希望这篇文章不要太长 - 我尽量简短而又不遗漏重要细节。任何建议将不胜感激。

乌罗斯

【问题讨论】:

    标签: android fragment mvvmcross


    【解决方案1】:

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

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

    在 Mvx 源代码中,这是我们尝试创建 Fragment 的 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 上的文档是一个好的开始——包括这张图片:

    【讨论】:

    • 我希望这个答案有帮助 - 如果没有,请尝试添加一些示例代码或可能涉及哪些活动/片段和 ViewModel 的图表。会尽力提供帮助。
    【解决方案2】:

    是的,正如 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了解更多详情。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-28
      • 1970-01-01
      • 2023-03-05
      • 1970-01-01
      • 2016-02-04
      • 1970-01-01
      • 1970-01-01
      • 2012-02-09
      相关资源
      最近更新 更多