2017-06-12 23 views
1

我正在使用選項卡編寫Android應用程序。我正在遵循樣本「FragmentSample」中的舊方法。它工作正常,但我正在評估切換到viewpager。使用MvxTabsFragmentActivity和MvxCachingFragmentStatePagerAdapter處理Mvvmcross中的標籤頁

在FragmentSample:

  • TabViewModel爲每個標籤 (VM1,VM2 ...)創建視圖模型的實例。
  • 在TabView的,每個標籤片段(Tab1Fragment,
    Tab2Fragment ...)被明確地關聯到TabViewModel創建的視圖模型(VM1,
    Vm2的...)。
  • 這是完美的,因爲我可以做一些導航初始化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); 
        } 
    } 
    

在MvvmCross-所有最新的示例項目 「實施例」:

  • 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; 
        } 
    } 
    

我的問題是:

  • 什麼是 「示例」 中 ExampleViewPagerStateViewModel創建RecyclerViewModel的使用情況如何?
  • 在FragmentSample中,Tab3.1 Tab3.2 Tab3.3共享相同的Vm3。可以 我用ViewPager做同樣的事情嗎?有沒有什麼辦法可以指定 標籤視圖(RecyclerView 1 ... 5)關聯到在ExampleViewPagerStateViewModel中創建的 RecyclerViewModel,但不是 新實例?

謝謝。

回答

0

剛剛發現它可以通過將ReraglerInfoModel中創建的FragmentInfo的第三個參數更改爲Recycler來完成。樣本應該做出改變。