私は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
同じprintステートメントが複数回呼び出されるため、彼は実際にはすべての古いFragmentをメモリに保持していることに気付きました。それが呼ばれる回数は、私が去ってその画面に戻る回数とともに増加します。したがって、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
フラグメントです。