web-dev-qa-db-fra.com

Activité avec plusieurs ViewModels

J'ai une Activity qui contient 3 RecyclerViews. J'ai besoin de renseigner RecyclerViews avec les données du référentiel distant (3 requêtes différentes). Puis-je utiliser plusieurs ViewModels dans Activity ou existe-t-il une meilleure solution (meilleure pratique).

15
Martin

Dans ce cas, je vous recommanderais d'utiliser un modèle de vue qui renseigne trois objets LiveData différents. De cette façon, l'interface utilisateur peut être mise à jour chaque fois qu'une de vos trois demandes reçoit une réponse. Pour plus d'informations sur l'utilisation de RecyclerView avec LiveData, reportez-vous au Exemple Google .

Je pense qu'avoir plusieurs modèles de vues par activité ne fait qu'augmenter la complexité et je ne vois pas l'intérêt de le faire.

9
guglhupf

Selon le principe d'ouverture/fermeture , vous devez créer trois ViewModels différents. La complexité n’augmente pas beaucoup et vous avez la possibilité de déplacer très facilement une ViewModel (ou tout simplement de la réutiliser) avec la RecyclerView correspondante Activity correspondante.

Bien sûr, il est parfois logique de ne pas respecter les règles - par exemple, si vous savez qu'il n'y a aucune chance que RecyclerView soit réutilisé ou déplacé vers un autre écran, vous pouvez alors opter pour une solution plus simple avec un ViewModel.

La même situation si la variable ViewModel (même avec les 3 listes) est susceptible de rester toujours très simple (seulement trois champs LiveData, juste quelques lignes de code pour les renseigner), vous pouvez enfreindre cette règle.

Cependant, la violation de O/CP n'est pas une bonne pratique - c'est juste une violation consciente de la règle.

J'ai deux recyclages dans un fragment. Je pense que l'utilisation de deux ViewModels serait mieux. Parce que différents recyclerviews ont leur propre requête de données, et la gestion d’états, en particulier les erreurs de connexion . Dans ce cas, séparer les différents ViewModels n’augmenterait pas la complexité, mais je pense que cela correspond bien à la règle du décuplement.

1
Thomas Liao

Encore plus simple, vous pouvez avoir un ViewModel, qui utilise une classe de service, qui utilise à son tour les trois référentiels pour obtenir les données. Par exemple:

XActivity -> XViewModel -> XService -> {Arepository, Brepository, Crepository}

0
Rowland Mtetezi