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,但不是 新實例?
謝謝。