我正在投入大量时间来正确理解体系结构组件,以及如何将所有内容都融入mvvm模式。到目前为止,我是这样看事情的(没有做匕首注射,因为我还没有那么远):
(一)
UserEntity
是一个
@Entity
要处理的批注
Room
的表创建
@Entity(tableName="users")
public class Users{
private long id;
private String name;
}
(二)
User
模型中的pojo类在应用程序周围使用它,并根据需要提供补充字段。
public class User{
private long id;
private String name;
private List<Role> roles;
private Preferences preferences;
}
除此之外,还可以有不同的pojo,这取决于我从db需要什么,例如,
UserWithRoles
(三)
UserDao
负责获取或插入/更新房间数据库中的信息。在这里,为了
@Insert
,请
@Update
我可以使用
用户实体
但是为了
@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)有
RepositoryUser
作为viewmodel和dao之间的存储库
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()
}
}
(英)
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
当我想通知活动做某事时,我会
callback.onFragmentAction(params)
以及
碎片动作
在活动中会开火并采取相应的行动。这个场景在mvvm中是如何处理的?片段如何与它的父活动对话?
-
按照常规的方法我会在碎片的内部
onCreateView
,为布局充气,使用
findViewById
获取视图并使用,例如textView.settext()或button.setOnClickListener()。在mvvm中如何做到这一点?使用数据绑定?