Android MVVM最简易举例(ViewModel&LiveData)

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

Android MVVM最简易举例(ViewModel&LiveData)_第1张图片

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代码:




    

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]

 

 

       

 

 

你可能感兴趣的:(#,Android,进阶答疑,MVVM最简易举例,MVVM,举例,Android,MVVM,ViewModel,举例,LiveData,举例)