場景舉例: 一個按鈕 點擊后次數累加顯示

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"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".test.TestMVVMActivity">
<TextView
android:id="@+id/test_textview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#0000ff"
android:padding="40dp"
android:text="當前次數:0 (點擊增加次數)"
android:textColor="#ffffff"
android:textSize="30sp" />
</LinearLayout>
3.TestViewModel:
class TestViewModel extends ViewModel {
MutableLiveData<String> name = new MutableLiveData();
public MutableLiveData<String> 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 extends ViewModel> T create(Class<T> 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]
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/277068.html
標籤:其他
上一篇:ios不顯示拍照和相冊選中的圖片
