安卓MVVM的理解及其ViewModel的使用

数据更新的本质是通过观察者模式对数据的改变进行监测,当Model改变的时候更新数据到View就可以了。说一下个人对View、Model、ViewModel的理解,如有不对欢迎指正:

1)View实现画面布局

2)Activity对画面的事件、生命周期进行控制

3)ViewModel,View与Model的桥梁。存储一份Model数据,并提供获取、设置数据的借口

4)Model对应的View需要的数据类型的封装

废话不多说 直接上代码

1、首先创建布局文件,作为简单的测试用

layout文件:activity_main.xml




    

    

    

2、创建layout对应的Activity通常一个Activity维护一个ViewModel

ViewModel的作用是对数据进行管理链接model和View的桥梁

MainActivity.java文件

package com.example.mytest;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProviders;

import android.content.DialogInterface;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {
    private TextView tvId;
    private TextView tvName;
    private Button btnChange;
    private MyViewModel userViewModel;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initView();
        initData();
    }

    private void initView() {
        tvId = (TextView) findViewById(R.id.tv_id);
        tvName = (TextView) findViewById(R.id.tv_name);
        btnChange = (Button) findViewById(R.id.btn_Click);
        btnChange.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String anotherName = "John Doe";
                userViewModel.setUsername(anotherName);
            }
        });
    }

    private void initData() {
        userViewModel = ViewModelProviders.of(this).get(MyViewModel.class);
        userViewModel.getUser().observe(this, new Observer() {
            @Override
            public void onChanged(@Nullable MyUser user) {
                updateView(user);
            }
        });

        userViewModel.setUsername("天才第一步");
    }

    private void updateView(MyUser user) {
        tvId.setText(user.getId() + "");
        tvName.setText(user.getName());
    }
}

3、封装一个数据对象,继承Serializable,使对象具有可以序列化的能力

Muser.cpp文件

package com.example.mytest;

import java.io.Serializable;

public class MyUser  implements Serializable {
        private int id;
        private String name;

        MyUser(int id ,String name) {
               this.id = id;
               this.name = name;
        }

        public int getId() {
                return id;
        }

        public void setId(int id) {
                this.id = id;
        }

        public String getName() {
                return name;
        }

        public void setName(String name) {
                this.name = name;
        }

        @Override
        public String toString() {
                return "MyUser{" +
                        "id=" + id +
                        ", name='" + name + '\'' +
                        '}';
        }
}

4、VIewModel的具体类,维护View需要的变量信息,类型为MutableLiveData。

MutableLiveData是专门存储一份View的数据的,其通过绑定Observe调用回调OnChanged函数实现数据更新(观察者模式实现可以自己写)。当需要更新View的时候通过set赋值就可以了

MyViewModel.java

package com.example.mytest;

import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel;

public class MyViewModel extends ViewModel {
    private MutableLiveData user;

    public LiveData getUser() {
        if (user == null)
            user = new MutableLiveData<>();
        return user;
    }

    public void setUsername(String username) {
        user.setValue(new MyUser(1, username));
    }
}

 

你可能感兴趣的:(Android)