Android-CleanArchitecture icon indicating copy to clipboard operation
Android-CleanArchitecture copied to clipboard

Models for list view item and detail view

Open rshah opened this issue 9 years ago • 6 comments

I'm fetching some data from 3rd party library to access their API.

For example, i created two use cases(FetchUserList and FetchUserDetail) to fetch user list and user detail. The user list will be displayed in recycler view but only the user name part. And in user detail view, user name and company name will be displayed.

The model received from the server(API model, as in the library) as follow:

class User {
   String name;
   Int companyId;
   ...
}

class Company {
   Int id;
   String companyName;
   ...
}

What model should i create in my domain layer?

Should i create two models, one for the fetch user list use case and another one for fetch detail use case?

Seems the result model will be dictated by the view, in recycler view i don't need company name(exclude unnecessary data), but in the detail view i need to display more data.

I'm thinking something like below, but in the user list view case i do not need the Company data

class UserModel {
    String name;
    Company company;
}

What would you suggest?

Thank you.

rshah avatar Jul 13 '16 09:07 rshah

Hi :)

If you want show only the name on the recyclerview, your model view only should be the name...

You can use a Mapper to pass the domain's layer to view's layer.

Dallanosm avatar Jul 15 '16 10:07 Dallanosm

There's a difference between the Entities in your Domain Layer and the ViewModels in your View Layer. Both don't need to be "in sync" with each other.

So your Domain entity can be

class UserModel {
    int userid;
    String name;
    Company company;
}

And you can have 2 View Models

class UserListViewModel {
    String name;
    int id;
}
class UserDetailsViewModel {
    String name;
   int id;
   String companyName;
   String companyUrl;
   ...
}

Each Use Case can get a UserModel or a List<UserModel> (whatever applies), and that should then be mapped to the correct ViewModel for your usage per use case.

Trikke avatar Jul 15 '16 11:07 Trikke

@Trikke I see, so in the case of FetchUserList use case, i do not need to get the company data from company repository, this would make the UserModel.company nullable.

rshah avatar Jul 16 '16 12:07 rshah

To build on this, the idea of mapping and having your view models is that you only put in there the data you need, so you can have different UserDetailsView models for different purposes coming from the same UserDomainModel

android10 avatar Aug 01 '16 16:08 android10

hello. so in the above case if user had edit/submit screen, then we shall create different view models for it and covert those model into domain model?

maulindesai avatar May 07 '18 08:05 maulindesai

There is a totally new approach that I have been working on, written in Kotlin: https://fernandocejas.com/2018/05/07/architecting-android-reloaded/

android10 avatar May 09 '18 19:05 android10