场景举例:  一个按钮 点击后次数累加显示

0.首先导入依赖: 在build.gradle 文件中

dependencies {    ... ...     implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'//ViewModelProviders}

1.创建Activity:TestMVVMActivity  

class TestMVVMActivity : FragmentActivity() {    var count = 0    override fun onCreate(savedInstanceState: Bundle?) {        super.onCreate(savedInstanceState)        setContentView(R.layout.activity_test_mvvm)        // 旧写法 已过时        //var mViewModel = ViewModelProviders.of(this,ViewModelFactory(TestViewModel())).get(TestViewModel::class.java)        // 新写法 1. ViewModelProviders替换为ViewModelProvider   2.“.get()” 变更为 “[]”        val mViewModel = ViewModelProvider(this,ViewModelFactory(TestViewModel()))[TestViewModel::class.java]        // 切记 不可重复注册               mViewModel.name.observe(this, Observer {            //每次调用mViewModel.setName() 时 会执行这里            test_textview.text = "当前次数:$it"        })        test_textview.setOnClickListener {            mViewModel.setName("" + count++)        }    }}

2.XML代码:

<?xml version="1.0" encoding="utf-8"?>    

3.TestViewModel:

class TestViewModel extends ViewModel {    MutableLiveData name = new MutableLiveData();    public MutableLiveData getName() {        return name;    }    public void setName(String name) {        this.name.postValue(name);  // 对应响应 getName 的 observe回调    }}

4.ViewModelFactory:

public class ViewModelFactory implements ViewModelProvider.Factory {    private TestViewModel mViewModel;    public ViewModelFactory(TestViewModel viewModel) {        this.mViewModel = viewModel;    }    @Override    public  T create(Class modelClass) {        if (modelClass.isAssignableFrom(TestViewModel.class)) {            return (T) mViewModel;        }        throw new IllegalArgumentException("Unknown class name");    }}

核心思想:

UI界面的显示  与  ViewModel的数据变化 形成了一个显著的 观察者模式     

当ViewModel的数据发生变化时,UI自动更新

核心实现是:    

TestViewModel 中的  MutableLiveData 变量     // 可被观察数据

以及  setName方法中的 postValue()    //数据改变时发通知

以及  TestMVVMActivity中的 mViewModel.name.observe(this, Observer {})      //数据变化时需响应的监听

实际使用场景中:

点击事件中的 mViewModel.setName("" + count++)   就相当于 接口请求后 给 model 赋值的 过程,

 这时候 因为接口数据返回,而改变数据 改变UI

 

注意:

        当出现 Cannot create an instance of class TestViewModel class 错误时


        在ViewModelProvider构造方法中加Application参数  

        或使用 ViewModelProvider.AndroidViewModelFactory 类创建 TestViewModel 均无法解决该异常                     

        正确的解决方案是新增 自定义的 ViewModelFactory 参数

     val mViewModel = ViewModelProvider(this, ViewModelFactory(TestViewModel()) )[TestViewModel::class.java]

 

 

       

 

 

更多相关文章

  1. Flutter知识点:数据存储之File
  2. Android中intent如何传递自定义数据类型
  3. Android(安卓)之 adapter.notifyDataSetChanged() 无响应
  4. Android(安卓)技巧:命令行运行 sqlite3
  5. Android-常用UI控件(Spinner/AutoCompleteTextView)
  6. android 大文件分割上传(分块上传)
  7. Android系统源码数据库(mmssms.db)
  8. Android的几种数据存储方式
  9. mybatisplus的坑 insert标签insert into select无参数问题的解决

随机推荐

  1. android 登录界面
  2. Android存储使用参考
  3. FaceBook like 按钮在 Android(安卓)WebV
  4. Android(安卓)Looper 复制粘贴
  5. Android(安卓)Kill App
  6. android缓存机制
  7. Android设置Progress的颜色
  8. android评分条RatingBar自定义设置
  9. Android(安卓)屏幕截图 代码
  10. android截屏