关于这个MVVM,现在公司的框架就是MVVM,刚开始感觉MVVM真的麻烦,真的不爽,但是真正用起来的时候,感觉比MVP好用多了,好用的不是点半点。= - =。嗯,喜新厌旧~。
关于MVVM的理解如下:
Model :负责数据实现和逻辑处理,类似MVP。
View : 对应于Activity和XML,负责View的绘制以及与用户交互,类似MVP。
ViewModel : 创建关联,将model和view绑定起来,如此之后,我们model的更改,通过viewmodel反馈给view,从而自动刷新界面。
项目中使用的MVVM框架Github地址:
https://github.com/googlesamples/android-architecture/tree/todo-mvvm-databinding
开发者下载该项目,然后需要复制几个工具类到自己的项目中:
ActivityUtils.java
ViewModelHolder.java
然后我们开启android自带的DataBinding开关,再app下的build.gradle中android节点下添加如下代码:
dataBinding {
enabled = true
}
这样MVVM的环境就算配置好了,接下来就是愉快的玩耍了~
首先还是老样子,UI显示:
hello world
首先我们创建我们的Fragment和ViewModel分别通过如下方法:
@NonNull
private TestOneFragment findOrCreateViewFragment() {
TestOneFragment tasksFragment =
(TestOneFragment) getSupportFragmentManager().findFragmentById(R.id.contentFrame);
if (tasksFragment == null) {
// Create the fragment
tasksFragment = TestOneFragment.newInstance();
ActivityUtils.addFragmentToActivity(
getSupportFragmentManager(), tasksFragment, R.id.contentFrame);
}
return tasksFragment;
}
private TestOneViewModel findOrCreateViewModel() {
// In a configuration change we might have a ViewModel present. It's retained using the
// Fragment Manager.
@SuppressWarnings("unchecked")
ViewModelHolder<TestOneViewModel> retainedViewModel =
(ViewModelHolder<TestOneViewModel>) getSupportFragmentManager()
.findFragmentByTag(TEST_ONE_VIEW_MODEL_TAG);
if (retainedViewModel != null && retainedViewModel.getViewmodel() != null) {
// If the model was retained, return it.
return retainedViewModel.getViewmodel();
} else {
// There is no ViewModel yet, create it.
TestOneViewModel viewModel = new TestOneViewModel(getApplicationContext());
// and bind it to this Activity's lifecycle using the Fragment Manager.
ActivityUtils.addFragmentToActivity(getSupportFragmentManager(), ViewModelHolder.createContainer(viewModel),
TEST_ONE_VIEW_MODEL_TAG);
return viewModel;
}
}
因为数据源改变了,XML的值自动改变,说明viewModel控制着XML,那就需要将XML和viewModel链接起来,同理我们有时候还需要获取代码层UI也就是Fragment的数据或者方法,此时也可以将XML和Fragment连接起来。
怎样连接呢?首先需要在XML声明ViewModel和Fragment变量,XML(test_one_fragment)代码如下:
<?xml version="1.0" encoding="utf-8"?>
<layout>
<data>
<variable
name="view"
type="com.example.liumengqiang.mvvmoneproject.TestOneFragment"/>
<variable
name="viewModel"
type="com.example.liumengqiang.mvvmoneproject.TestOneViewModel"/>
</data>