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。
一、DataBinding简单使用
使用 MVVM 首先要用到 DataBinding,所以我们先简单了解一下 DataBinding 的使用。DataBinding 是一个实现数据和UI绑定的框架,同时也是实现MVVM模式所依赖的工具。
1、配置DataBinding
在 app 的 build.gradle 文件中配置 DataBinding。
android {
....
dataBinding {
enabled = true
}
}2、生成DataBinding布局
在 Android 的 xml 布局文件的根布局使用 Alt + 回车键自动生成 DataBinding 布局。
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable
name="user"
type="com.app.mvvmdemo.bean.User" />
<variable
name="activity"
type="com.app.mvvmdemo.databinding.BindingActivity" />
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical">
<TextView
android:id="@+id/tv_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="16sp"
android:text="@{user.name}" />
<EditText
android:layout_width="100dp"
android:layout_height="wrap_content"
android:layout_marginTop="15dp"
android:text="@={user.userInput}"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="15dp"
android:onClick="@{activity.onclick}"
android:text="替换" />
</LinearLayout>
</layout>data标签下为此布局中使用的属性
@{}:单向绑定,数据变化视图内容更新
@={}:双向绑定,视图内容变化,数据也会变化,多用于输入框
3、实体数据
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;
}
}4、Activity代码
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;
}
}二、MVVM框架实现
1、生成DataBinding布局
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable
name="viewModel"
type="com.app.mvvmdemo.MVVMViewModel" />
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical">
<TextView
android:id="@+id/tv_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="16sp"
android:text="@{viewModel.result}" />
<EditText
android:layout_width="100dp"
android:layout_height="wrap_content"
android:layout_marginTop="15dp"
android:text="@={viewModel.userInput}"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="15dp"
android:onClick="@{viewModel.getData}"
android:text="替换" />
</LinearLayout>
</layout>2、实现MVVMViewModel
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();
}
3、Activity代码
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);
}
}版权声明:本文为c19344881x原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。