MVVMパターン の場合、ViewModelにはビジネスロジックが含まれ、更新が必要になったときにViewに通知します。また、ユーザーイベントに関するビューから通知されます。
私が理解したように、各モデルには関連するViewModelが必要です。したがって、次のモデルがある場合:
次のViewModelがあります。
ただし、MVVMを使用したデータバインディングに関するすべての例では、レイアウトに単一のViewModelを使用しています。そして最近、Googleは ViewModelArchitecture Components 内のクラスを導入しました。これにより、アクティビティには、関連するすべてのモデルに接続する単一のViewModelが含まれることになります。
ユーザー/アカウント-> ActivityViewModel
RecyclerView を考えると、これはさらに複雑になります。各アダプターアイテムはViewModel自体になる可能性があるため、RecyclerViewを使用するアクティビティは、リスト内に複数のViewModelを持ち、残りのビューコンテンツ用のマスターモデルを追加します(ViewModelからの情報が必要な場合)。例えば:
この例では、アカウントのViewModelと1つのUserViewModelのリストがあります。これはどのように単一のActivityViewModelに埋め込まれますか?
Googleでは、ViewModel
ごとに1つのView
(つまり、Activity
またはFragment
)を使用することをお勧めします( https://youtu.be/ Ts-uxYiBEQ8?t = 8m40s )、各ViewModel
内に複数のタイプのモデルを含めることができます。ただし、MVVMの原則ではViewModel
ごとに1つのモデルタイプのみを使用するため、Googleのプレゼンテーションでは:/と矛盾しています。どのアプローチがアプリに適しているかを判断する必要があると思います。
あなたが言及したリストの例について、それはあなたがそれをする方法ではありません、あなたが ページングライブラリ を使用するリストのために。これを使用する方法の詳細は、上記でリンクしたビデオの最後にあります。
1つのビューモデルが標準です。ただし、Googleでさえ、複数のビューモデルを使用することを推奨しています。電話アプリをタブレットアプリに移行する場合、非常に便利です。 1つのタブビューで複数の電話ビューを組み合わせると、モデルを再利用するのに便利です。
コーディング時にSOLIDの原則を念頭に置いている場合、S(単一のクラスの責任)により、複数のビューモデルを使用する可能性があります。
ただし、ビューごとに1つがほぼ標準であり、上記のように、複数のビューを使用する理由があります。
ユーザーとアカウントの関係は何ですか?これらが2つの別個の無関係なモデルである場合、それぞれに独自のビューとビューモデルが必要です。単一の責任原則を忘れないでください。各モジュールは、ロジックの一部のみを担当する必要があります。そうすれば、ドメインロジックまたはモデルへの変更は、その部分のみに影響し、その部分のみに影響します。
アクティビティに異なるフラグメントがある場合...各フラグメントに異なるViewModelを使用します...すべてのフラグメントに同じViewModelを使用すると、データが失われる可能性があります...