私はMVVMパターンに従っています-つまり、各フラグメントにViewModelがあります。
ViewPager2を使用して2つのタブを追加しました。
私のアダプターは次のようになります:
_@Override
public Fragment createFragment(int position) {
switch (position) {
case 0:
return new MergedItemsFragment();
case 1:
return new ValidatedMergedItemsFragment();
}
return new MergedItemsFragment();
}
_
タブは機能しています。ただし、MergedItemsFragmentのViewModelの動作がおかしいことに気づきました。タブを追加する前に、次のようにFragmentに移動しました。
_NavHostFragment.findNavController(this).navigate(R.id.action_roomFragment_to_itemsFragment);
_
そのフラグメントをNavHostFragment.findNavController(this).popBackStack()
で残し、後でそのフラグメントに戻ると、新しい空のViewModelが取得されます。 これは意図されたものです。
新しいアプローチでは、return new MergedItemsFragment()
を使用してナビゲートしています。そのフラグメントを残して、後で戻ると、ViewModelが古いデータを含むになります。ユーザーが別のフラグメントで別のデータを選択したため、古いデータはもはや関連がないため、これは問題です。
アップデート#1
同じ印刷ステートメントが複数回呼び出されるため、彼は実際にall古いFragmentsをメモリに保持していることに気付きました。それが呼ばれる回数は、私が去ってその画面に戻る回数とともに増加します。そのため、10回離れて戻り、デバイスを回転させると、実際には1行が10回実行されます。 ViewModelsで機能する方法でナビゲーションコンポーネントを使用してTabs/ViewPagersを実装する方法を推測しますか?
アップデート#2
私はこのように私のViewModelsを設定しました:
_viewModel = new ViewModelProvider(this, providerFactory).get(MergedItemViewModel.class)
_
私は同じ結果を得ます:
_viewModel = ViewModelProviders.of(this).get(MergedItemViewModel.class);
_
フラグメント自体にViewModelをバインドします。したがって、this
はフラグメントです。
new ViewModelProvider(requireActivity()).get("your_key", YourViewModel.class)
RequireActivityを使用して、フラグメントではなくViewModelを取得します。