我正在投入大量时间来正确理解架构组件及其如何适配MVVM模式。到目前为止,这是我对事物的看法(没有进行Dagger注入,因为我还没有做到):
a)UserEntity
是一个带有@Entity
注释的类,用于处理Room
的表创建。
@Entity(tableName="users")
public class Users{
private long id;
private String name;
}
b) 在模型中使用 User
pojo 类,在应用程序周围使用它,并根据需要添加补充字段。public class User{
private long id;
private String name;
private List<Role> roles;
private Preferences preferences;
}
除此之外还可以根据我从数据库中需要什么不同的POJO,例如:UserWithRoles
c)UserDao
负责从Room Database获取或插入/更新信息。这里,对于@Insert
、@Update
,我可以使用UserEntity
,但对于@Query
,我也可以使用POJO类。
@Dao
public abstract class UserDao{
@Insert
public abstract long insertUser(User user)
@Query("Select someFields from inner joined tables")
public abstract LiveData<List<UserRoles> getUsersWithRoles();
}
d) 在ViewModel和Dao之间使用RepositoryUser
作为仓库
public class RepositoryUser{
private UserDao userDao;
public RepositoryUser(Application app){
Database db = Databaase.getDatabase(app.getApplicationContext);
userDao = db.userDao();
}
public LiveData<List<UserWithRoles>> getUsersWithRoles(){
return userDao.getUsersWithRoles()
}
}
e) UserWithRolesViewModel
将可用于显示用户及其角色列表的片段
public class UserWithRolesViewModel extends AndroidViewModel{
private RepositoryUser repositoryUser;
public UserWithRolesViewModel(Application app){
super(app);
repositoryUser = new RepositoryUser(app);
}
public LiveData<List<UserWithRoles>> getUsersWithRoles(){
return repositoryUser.getUsersWithRoles()
}
}
f) 在我的代码片段中,我可以这样做:
public void onCreate(...){
viewModel = ViewModelProviders.of(this).get(UserWithRolesViewModel.class);
}
public View onCreateView(...){
viewModel.getUsersWithRoles().observe(...)
public void onChanged(...){
adapter.setData(...);
}
}
然而,有一些内容确实缺失。根据MVVM的理解,视图应该只负责显示信息,不应在片段或活动中进行实际逻辑操作甚至处理。现在我有两个问题:
- 通常情况下,我会创建一个接口,例如
onFragmentAction
并在activity
中实现它。然后在fragment
中,当我想要通知activity执行某些操作时,我会执行callback.onFragmentAction(params)
,activity中的onFragmentAction
将触发并相应地执行。MVVM中如何处理这种场景?片段如何与其父活动通信? - 通常情况下,我会在片段的
onCreateView
中膨胀布局,使用findViewById
获取视图并使用,例如textView.setText()
或button.setOnClickListener()
。在MVVM中如何做到这一点?使用DataBinding吗?