web-dev-qa-db-ja.com

AndroidでMVVMを使用する場合、各アクティビティには1つの(そして1つだけの)ViewModelが必要ですか?

MVVMパターン の場合、ViewModelにはビジネスロジックが含まれ、更新が必要になったときにViewに通知します。また、ユーザーイベントに関するビューから通知されます。

私が理解したように、各モデルには関連するViewModelが必要です。したがって、次のモデルがある場合:

  • ユーザー
  • アカウント

次のViewModelがあります。

  • UserViewModel
  • AccountViewModel

ただし、MVVMを使用したデータバインディングに関するすべての例では、レイアウトに単一のViewModelを使用しています。そして最近、Googleは ViewModelArchitecture Components 内のクラスを導入しました。これにより、アクティビティには、関連するすべてのモデルに接続する単一のViewModelが含まれることになります。

ユーザー/アカウント-> ActivityViewModel

RecyclerView を考えると、これはさらに複雑になります。各アダプターアイテムはViewModel自体になる可能性があるため、RecyclerViewを使用するアクティビティは、リスト内に複数のViewModelを持ち、残りのビューコンテンツ用のマスターモデルを追加します(ViewModelからの情報が必要な場合)。例えば:

enter image description here

この例では、アカウントのViewModelと1つのUserViewModelのリストがあります。これはどのように単一のActivityViewModelに埋め込まれますか?

20
fhsilva

Googleでは、ViewModelごとに1つのView(つまり、ActivityまたはFragment)を使用することをお勧めします( https://youtu.be/ Ts-uxYiBEQ8?t = 8m40s )、各ViewModel内に複数のタイプのモデルを含めることができます。ただし、MVVMの原則ではViewModelごとに1つのモデルタイプのみを使用するため、Googleのプレゼンテーションでは:/と矛盾しています。どのアプローチがアプリに適しているかを判断する必要があると思います。

あなたが言及したリストの例について、それはあなたがそれをする方法ではありません、あなたが ページングライブラリ を使用するリストのために。これを使用する方法の詳細は、上記でリンクしたビデオの最後にあります。

9
Franco

ビュー(アクティビティ、フラグメント、またはカスタムビュー)ごとに1つのViewModelがあり、複数のLiveDataがあり、論理ユニットごとに1つ必要です。イメージでは、1つの論理ユニットがユーザーデータになり、別の論理ユニットが設定データになるため、2つのLiveDataがViewModelで公開されます。

View with multiple LiveData

これらの概念は、最後のGoogle I/Oで提示された推奨アプリアーキテクチャgoogleでも見ることができます。アクティビティ/フラグメントには、複数のLiveDataを持つ1つのViewModelがあります。

enter image description here

7
Eduardo

1つのビューモデルが標準です。ただし、Googleでさえ、複数のビューモデルを使用することを推奨しています。電話アプリをタブレットアプリに移行する場合、非常に便利です。 1つのタブビューで複数の電話ビューを組み合わせると、モデルを再利用するのに便利です。

コーディング時にSOLIDの原則を念頭に置いている場合、S(単一のクラスの責任)により、複数のビューモデルを使用する可能性があります。

ただし、ビューごとに1つがほぼ標準であり、上記のように、複数のビューを使用する理由があります。

3
Hermann Klecker

ユーザーとアカウントの関係は何ですか?これらが2つの別個の無関係なモデルである場合、それぞれに独自のビューとビューモデルが必要です。単一の責任原則を忘れないでください。各モジュールは、ロジックの一部のみを担当する必要があります。そうすれば、ドメインロジックまたはモデルへの変更は、その部分のみに影響し、その部分のみに影響します。

1
Omar Silva

アクティビティに異なるフラグメントがある場合...各フラグメントに異なるViewModelを使用します...すべてのフラグメントに同じViewModelを使用すると、データが失われる可能性があります...

0
Shivam Dawar