Sur Modèle MVVM , le ViewModel contient la logique métier et informe la View lorsqu'elle doit être mise à jour. Il est également informé par la vue des événements utilisateur.
Si j'ai bien compris, chaque modèle devrait avoir un ViewModel associé. Donc, si nous avons les modèles suivants:
Nous aurions les ViewModels suivants:
Cependant, tous les exemples que je trouve sur la liaison de données avec MVVM utilisent un seul ViewModel pour une mise en page. Et récemment, Google a introduit le ViewModel class dans Composants d'architecture . Cela m'amène à penser qu'une activité aurait un seul ViewModel qui se connecterait à tous les modèles associés:
Utilisateur/Compte -> ActivityViewModel
Cela devient encore plus compliqué si nous pensons à un RecyclerView . Chaque élément de l'adaptateur peut être un ViewModel lui-même. Par conséquent, une activité avec RecyclerView aurait plusieurs ViewModels dans la liste et un maître pour le contenu de la vue restante (en supposant qu'ils exigent des informations d'un ViewModel). Par exemple:
Dans cet exemple, nous avons une liste de Account ViewModels et un UserViewModel. Comment cela serait-il intégré dans un seul ActivityViewModel?
Google vous suggère d'utiliser 1 ViewModel
par View
(c'est-à-dire Activity
ou Fragment
) (voir https://youtu.be/Ts-uxYiBEQ8?t=8m40s ), puis à l'intérieur de chaque ViewModel
, vous pouvez en avoir plusieurs. type de modèle. Cependant, le principe MVVM étant de n'avoir qu'un seul type de modèle par ViewModel
, la présentation de Google contredit donc ceci: /. Je suppose que vous devrez décider quelle approche convient le mieux à votre application.
En ce qui concerne l’exemple de liste que vous avez mentionné, ce n’est pas ainsi que vous procéderiez, pour les listes, vous utiliseriez la bibliothèque paging . Vous pouvez voir les détails sur la façon d'utiliser ceci à la fin de la vidéo que j'ai liée ci-dessus.
Un modèle de vue est standard. Cependant, même Google suggère que vous pouvez avoir plus d'un modèle de vue. Cela est très pratique lorsque vous associez une application de téléphone à une application de tablette. Lorsque vous combinez plusieurs vues de téléphone sur un seul onglet, il est pratique de réutiliser les modèles.
Si vous tenez compte des principes SOLID lors de la programmation, le S (responsable unique d'une classe) peut vous amener à utiliser plusieurs modèles de vue.
Cependant, une vue est à peu près standard et vous devriez avoir des raisons, comme indiqué plus haut, d'en utiliser plus d'une.
Quelle est la relation entre les utilisateurs et les comptes? S'il s'agit de deux modèles distincts non liés, ils doivent avoir chacun leur propre vue et leur propre modèle. N'oubliez pas le principe de responsabilité unique: chaque module ne devrait être responsable que d'une partie de votre logique. De cette manière, toute modification apportée à la logique de votre domaine ou à vos modèles n'affectera que cette partie et uniquement cette partie.
Vous devez avoir un ViewModel par vue (activité, fragment ou vue personnalisée), avec plusieurs LiveData, un pour chaque unité logique. Dans l'image, une unité logique serait constituée des données utilisateur, une autre unité logique serait les données des paramètres. Vous auriez ainsi deux LiveData exposés dans le ViewModel.
Ces concepts peuvent également être visibles dans l'architecture d'applications recommandée google présentée dans le dernier Google I/O, où une activité/fragment a 1 ViewModel avec plusieurs LiveData:
S'il existe différents fragments dans une activité ... utilisez un ViewModel différent pour chaque fragment ... si vous utilisez le même ViewModel pour tous les fragments, les données pourraient être perdues ...