Activity with multiple ViewModels
Solution 1
In this case I would recommend to use one view model which populates three different LiveData objects. This way the UI can get updated whenever one of your three requests gets a response. For details how to use a RecyclerView with LiveData take a look into the Google Example.
I think having multiple viewmodels per activity only increases complexity and I do not see any value in doing that.
Solution 2
According to the open/closed principle, you should create three different ViewModel
s. The complexity isn't increased that much, and you are gaining the ability to move one ViewModel
(or just reuse it) with the corresponding RecyclerView
to the another Activity
very easily.
Of course, sometimes breaking rules makes sense - for example if you know, there is no chance, that RecyclerView
will be reused or moved to another screen, and then you can go for simpler solution with one ViewModel
.
The same situation if the ViewModel
(even with the 3 lists) is likely to stay always very simple (just three LiveData
fields, just a few lines of code to populate them), you can break this rule.
However violation of O/CP is not a good practice - it's just a conscious breaking of rule.
Solution 3
I got two recyclerview in a fragment. I think that use two ViewModels would be better. Cause different recyclerviews got their own data request, and state handling especially connections error. In this case separate into different ViewModels would not increase the the complexity, but I think it well fit the rule of decupling
Martin
Updated on September 01, 2020Comments
-
Martin almost 4 years
I have an
Activity
that contains 3RecyclerViews
. I need populateRecyclerViews
with data from remote repository (3 different requests). Can I use multipleViewModels
in theActivity
, or is there any better solution (best practice). -
Rajan Prasad over 6 yearsThe Google example link is dead.
-
Piotr Aleksander Chmielowski over 6 years@guglhupf There is a value in doing that: decreasing coupling between
RecyclerViews
and increasing the ability to reuse them independently or move to another screen. -
mol about 6 yearsIs it possible for
ViewModels
to communicate between each other? Let's say oneViewModel
hasLiveData
object, that triggersLiveData
in anotherViewModel
. Tying them together inActivity
seems wrong, so how would you do this? -
Piotr Aleksander Chmielowski about 6 yearsI don't know what is your use case but in general I'd avoid connecting one
ViewModel
to the another. I'd rather create another object and inject the same instance of it to the bothViewModels
. Of course this third, common object can also haveLiveData
as a member, which one of theViewModel
can update and the other - observe. If you need more detailed info, please post a new question and I'd be glad to answer it. -
Piotr Aleksander Chmielowski about 6 yearsThis solution will make the coupling between
Activity
,ViewModel
andService
very high so that moving oneRecyclerView
fromXActivity
toYActivity
will be hard.