我投入大量时间来正确理解架构组件以及一切如何适应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
负责在会议室数据库中获取或插入/更新信息。在这里,对于@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)将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()
}
}
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
上,当我想通知活动做某事时,我将执行callback.onFragmentAction(params)
,活动中的onFragmentAction
将触发并采取相应的行动。 MVVM中如何处理这种情况?片段如何与其父活动对话?onCreateView
内填充布局,使用findViewById
获取视图并使用,例如textView.setText()或button.setOnClickListener()。如何在MVVM中完成此操作?使用数据绑定? 答案 0 :(得分:4)
例如,我通常会创建一个接口 onFragmentAction并在活动中实现。然后当我碎片 想告知活动要做某事,我会做 callback.onFragmentAction(params)和onFragmentAction在 活动会触发并采取相应行动。如何处理这种情况 在MVVM中?片段如何与其父活动对话?
要进行交互,您可以创建ViewModel
和Fragment
之间共享的Activity
。在这种情况下,您有一个抽象,您可以在ViewModel
LiveData
中推送一些数据,无论谁监听相同的ViewModel
,都会收到一个事件。
例如this method is recommended用于Fragment
到Fragment
的通信,但我认为它也适合Fragment
到Activity
。
按常规方式,我会在片段的onCreateView中使用, 放大布局,使用findViewById获取视图并用于 实例textView.setText()或button.setOnClickListener()。怎么能 这可以在MVVM中完成吗?使用数据绑定?
您可以使用DataBinding或Kotlin Android Extension,两者都可以用于MVVM。 通过DataBinding应该更好,因为它将减少样板。 但是我个人觉得Kotlin Android Extensions也很干净。