Android简单实现mvvm框架 | 青训营笔记

153 阅读1分钟

这是我参与【第四届青训营】参加笔记创作活动的第5天

Android使用MVVM架构

在MVVM架构有三层模型,Model层、ViewModel层以及View层。

Model层:

负责数据提供,业务逻辑的数据结构一般放入到此层,而且通过Model进行相应的数据交换,比如网络请求、上传数据或者本地存储、获取数据等。

View层:

负责页面的显示,提供用户的各种交互。View层不涉及任何的业务逻辑的处理。

ViewModel层:

负责业务逻辑处理,和View层有明确的责任分层,也区分于Model层。ViewModel通过Model提供的数据进行业务处理,再通过View进行页面的显示,View通过需要通过ViewModel来处理业务逻辑。

DataBinding框架

Android Studio使用DataBinding框架需要在module目录下的build.gradle文件中添加配置:

android{
    ...
    dataBinding{
        enabled=true
    }
}

实体类创建需要放在Model层,并且在创建实体类时需要继承BaseObservable,通过在实体类的属性get()方法上注解“@Bindable”,在属性的set()方法中添加notifyPropertyChanged()方法.参数为“BR.xxx”,“xxx”标识属性的名称。比如:

public class Person extends BaseObservable{
    private String name;
    private int age;
    
    @Bindable
    public String getName(){
        return name;
    }
    
    @Bindable
    public int getAge(){
        return age;
    }
    
    public void setName(String name){
        this.name = name;
        notifyPropertyChanged(BR.name);
    }
    
    public void setAge(int age){
        this.age = age;
        notifyPropertyChanged(BR.age);
    }
    
} 

布局文件也会也会有差异:

<?xml version="1.0" encoding="utf-8"?>
<layout
    xmlns:android="http://schemas.android.com/apk/res/android">

    <data>

        <variable
            name="person"
            type="....Person"/>//这里为实体类的包名
    </data>

    <LinearLayout
        android:id="@+id/activity_main"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <TextView
            android:id="@+id/nameTv"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@={person.name}"
            android:textAlignment="center"/>
    </LinearLayout>
</layout>

activity中实现代码:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //  替换 setContentView(R.layout.activity_main);
    ActivityMainBinding binding = DataBindingUtil.setContentView(this,R.layout.activity_main);
    final Person person = new Person();
    person.setName("张三");
    binding.setPerson(person);
    new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
            person.setName("李四");
        }
    }, 3000);
}

就实现了数据的双向绑定,只要在activity中修改person对象中的name属性,则显示的数据就会自动更新。