web-dev-qa-db-ja.com

ViewPager2 / TabsのViewModel状態に関する問題

私は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はフラグメントです。

9
user123456789
new ViewModelProvider(requireActivity()).get("your_key", YourViewModel.class)

RequireActivityを使用して、フラグメントではなくViewModelを取得します。

0
boybeak