Android(安卓)MVVM最简易举例(ViewModel&LiveData)
16lz
2022-05-24
场景举例: 一个按钮 点击后次数累加显示
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]
更多相关文章
- Flutter知识点:数据存储之File
- Android中intent如何传递自定义数据类型
- Android(安卓)之 adapter.notifyDataSetChanged() 无响应
- Android(安卓)技巧:命令行运行 sqlite3
- Android-常用UI控件(Spinner/AutoCompleteTextView)
- android 大文件分割上传(分块上传)
- Android系统源码数据库(mmssms.db)
- Android的几种数据存储方式
- mybatisplus的坑 insert标签insert into select无参数问题的解决