使用MvxTabsFragmentActivity和MvxCachingFragmentStatePagerAdapter在Mvvmcross中处理选项卡

时间:2017-06-12 17:13:20

标签: tabs xamarin.android mvvmcross

我正在编写带有标签的Android应用。我正在按照样本中的旧方法" FragmentSample"。它工作正常,但我正在评估切换到viewpager。

在FragmentSample中:

  • TabViewModel为每个单独的选项卡创建一个viewmodel实例 (Vm1,Vm2 ......)。
  • 在TabView中,每个标签片段(Tab1Fragment,
    Tab2Fragment ...)显式关联到viewmodel(Vm1,
    Vm2 ...)在TabViewModel中创建。
  • 这是完美的,因为我可以对Vm1进行一些导航初始化, TabViewModel中的Vm2。

    public class TabViewModel : BaseViewModel
    {
        public TabViewModel()
        {
            Vm1 = Mvx.IocConstruct<FirstTabViewModel>();
            Vm2 = Mvx.IocConstruct<SecondTabViewModel>();
            Vm3 = Mvx.IocConstruct<ThirdTabViewModel>();
        }
    
        public BaseViewModel Vm1 { get; set; }
        public BaseViewModel Vm2 { get; set; }
        public BaseViewModel Vm3 { get; set; }
    }
    
    public class TabView : MvxTabsFragmentActivity
    {
        public TabViewModel TabViewModel
        {
            get { return (TabViewModel)base.ViewModel; }
        }
    
        public TabView()
            : base(Resource.Layout.Page_TabView, Resource.Id.actualtabcontent)
        {
        }
    
        protected override void AddTabs(Bundle args)
        {
            AddTab<Tab1Fragment>("Tab1", "Tab 1", args, TabViewModel.Vm1);
            AddTab<Tab2Fragment>("Tab2", "Tab 2", args, TabViewModel.Vm2);
            // note that
            AddTab<Tab3Fragment>("Tab3.1", "Tab 3.1", args, TabViewModel.Vm3);
            AddTab<Tab3Fragment>("Tab3.2", "Tab 3.2", args, TabViewModel.Vm3);
            AddTab<Tab3BigFragment>("Tab3.3", "Tab 3.3", args, TabViewModel.Vm3);
        }
    }
    

在最新的示例项目&#34;示例&#34;在MvvmCross-All:

  • ExampleViewPagerStateViewModel创建RecyclerViewModel的实例
  • ExampleViewPagerStateFragment定义选项卡(RecyclerView 1 ... 5)使用MvxCachingFragmentStatePagerAdapter。
  • 执行MvxCachingFragmentStatePagerAdapter时,另一个 将创建RecyclerViewModel的实例
  • 在ExampleViewPagerStateViewModel中创建的RecyclerViewModel似乎 与制作的标签完全无关。我评论说了 在ExampleViewPagerStateViewModel中创建并且没有更改 应用行为。
  • RecyclerViewModel创建了两次。它是一样的 ExampleViewPagerFragment在同一个项目中,在旧版本中 这个样本XPlatformMenus。

    public class ExampleViewPagerStateViewModel
        : MvxViewModel
    {
        public RecyclerViewModel Recycler { get; private set; }
    
        public ExampleViewPagerStateViewModel()
        {
            Recycler = new RecyclerViewModel();
        }
    }
    
    public class ExampleViewPagerStateFragment : BaseStateFragment<ExampleViewPagerStateViewModel>
    {
        protected override int FragmentId => Resource.Layout.fragment_example_viewpager_state;
    
        public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
         {
            var view = base.OnCreateView(inflater, container, savedInstanceState);
    
            var viewPager = view.FindViewById<ViewPager>(Resource.Id.viewpager);
            if (viewPager != null)
            {
                var fragments = new List<MvxCachingFragmentStatePagerAdapter.FragmentInfo>
                {
                    //new MvxCachingFragmentStatePagerAdapter.FragmentInfo("RecyclerView 1", typeof (RecyclerViewFragment),
     //                                                                  typeof (RecyclerViewModel)),
                    //new MvxCachingFragmentStatePagerAdapter.FragmentInfo("RecyclerView 2", typeof (RecyclerViewFragment),
     //                                                                  typeof (RecyclerViewModel)),
                    //new MvxCachingFragmentStatePagerAdapter.FragmentInfo("RecyclerView 3", typeof (RecyclerViewFragment),
     //                                                                  typeof (RecyclerViewModel)),
                    //new MvxCachingFragmentStatePagerAdapter.FragmentInfo("RecyclerView 4", typeof (RecyclerViewFragment),
     //                                                                  typeof (RecyclerViewModel)),
                new MvxCachingFragmentStatePagerAdapter.FragmentInfo("RecyclerView 5", typeof (RecyclerViewFragment),
                                                                   typeof (RecyclerViewModel))
            };
                viewPager.Adapter = new MvxCachingFragmentStatePagerAdapter(Activity, ChildFragmentManager, fragments);
            }
    
            var tabLayout = view.FindViewById<TabLayout>(Resource.Id.tabs);
            tabLayout.SetupWithViewPager(viewPager);
    
            return view;
        }
    }
    

我的问题是:

  • 创建RecyclerViewModel的用法是什么? ExampleViewPagerStateViewModel in&#34; Example&#34;?
  • 在FragmentSample中,Tab3.1 Tab3.2 Tab3.3共享相同的Vm3。能够 我用ViewPager做同样的事情?有什么方法我可以指定 要关联的选项卡视图(RecyclerView 1 ... 5) RecyclerViewModel在ExampleViewPagerStateViewModel中创建但不是 新实例?

感谢。

1 个答案:

答案 0 :(得分:0)

刚刚发现可以通过将FragmentInfo的第三个参数更改为RecyclerViewModel中创建的Recycler来完成。样本应该做出改变。