MVVM 是 Model-View-ViewModel 的简写,是M-V-VM三部分组成。它本质上就是 MVC 的改进版。MVVM 就是将其中的 View 的状态和行为抽象化,其中 ViewModel 将视图 UI 和业务逻辑分开,它可以取出 Model 的数据同时帮忙处理 View 中由于需要展示内容而涉及的业务逻辑。
MVVM采用双向数据绑定,view中数据变化将自动反映到 viewmodel上,反之,model中数据变化也将会自动展示在页面上。把 Model 和 View 关联起来的就是 ViewModel。ViewModel 负责把 Model 的数据同步到 View 显示出来,还负责把 View 的修改同步回 Model。
使用 MVVM 首先要用到 DataBinding,所以我们先简单了解一下 DataBinding 的使用。DataBinding 是一个实现数据和UI绑定的框架,同时也是实现MVVM模式所依赖的工具。
在 app 的 build.gradle 文件中配置 DataBinding。
android {
....
dataBinding {
enabled = true
}
}
在 Android 的 xml 布局文件的根布局使用 Alt + 回车键自动生成 DataBinding 布局。
data标签下为此布局中使用的属性
@{}:单向绑定,数据变化视图内容更新
@={}:双向绑定,视图内容变化,数据也会变化,多用于输入框
public class User {
private String name;
private String userInput;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getUserInput() {
return userInput;
}
public void setUserInput(String userInput) {
this.userInput = userInput;
}
}
public class BindingActivity extends AppCompatActivity {
private ActivityBindingBinding binding;
private User user;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = DataBindingUtil.setContentView(this, R.layout.activity_binding);
user = new User();
user.setName("张三");
binding.setUser(user);//绑定User
binding.setActivity(this);//绑定Activity
}
public void onclick(View view){
user.setName(user.getUserInput());
binding.setUser(user);//更新数据
}
}
这里还可以做进一步优化,省略点击事件中的更新数据,修改实体类代码
public class User extends BaseObservable {
private String name;
private String userInput;
@Bindable
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
notifyPropertyChanged(BR.name); //更新数据
}
public String getUserInput() {
return userInput;
}
public void setUserInput(String userInput) {
this.userInput = userInput;
}
}
public class MVVMViewModel extends BaseObservable {
private MVVMModel mvvmModel;
//EditText数据
private String userInput;
//网络返回数据
private String result;
public MVVMViewModel(Application application){
mvvmModel = new MVVMModel();
}
public void getData(View view){
mvvmModel.getHttpData(userInput, new MCallback() {
@Override
public void onSuccess(String text) {
setResult(text);
}
@Override
public void onFailed() {
setResult("数据获取失败");
}
});
}
@Bindable
public String getResult() {
return result;
}
public void setResult(String result) {
this.result = result;
notifyPropertyChanged(BR.result);
}
public String getUserInput() {
return userInput;
}
public void setUserInput(String userInput) {
this.userInput = userInput;
}
}
public class MVVMModel {
//模拟网络请求获取数据
public void getHttpData(String user, MCallback callback){
Random random = new Random();
boolean isSuccess = random.nextBoolean();
if (isSuccess){
callback.onSuccess("数据获取成功:" + user);
} else {
callback.onFailed();
}
}
}
public interface MCallback {
void onSuccess(String text);
void onFailed();
}
public class MVVMActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivityMvvmBinding binding =
DataBindingUtil.setContentView(this, R.layout.activity_mvvm);
//绑定ViewModel
MVVMViewModel mvvmViewModel = new MVVMViewModel(getApplication());
binding.setViewModel(mvvmViewModel);
}
}