繼JectPack架構學習系列一_ViewModel. 所有的用戶界面數據放在ViewModel中管理, 還是不夠. 每次數據改變的時候都需要驅動視圖來驅動刷新控件. 比如用戶按鈕, 數據遞增之後要改變數據 綁定數據. 那麼ViewModel中的數據可以用LiveData來表示. 當數據發生改變的時候, 可以加一個觀察者, 自動的刷新界面的數據, 從而減少交互, Controller即是界面就進一步減少了簡化
首先, 定義ViewModel:
package com.hzhztech.livedatatest.viewmodel;
import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel;
public class ViewModelWithLiveData extends ViewModel {
private MutableLiveData<Integer> liveDataNumber;
public MutableLiveData<Integer> getLiveDataNumber() {
if(liveDataNumber == null) {
liveDataNumber = new MutableLiveData<>();
liveDataNumber.setValue(0);
}
return liveDataNumber;
}
public void addLiveDataNumber(int n) {
liveDataNumber.setValue(liveDataNumber.getValue() + n);
}
}
然後在Controller中使用
package com.hzhztech.livedatatest
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.ImageButton
import android.widget.TextView
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProviders
import com.hzhztech.livedatatest.viewmodel.ViewModelWithLiveData
import kotlinx.android.synthetic.main.activity_main.*
class MainActivity : AppCompatActivity() {
lateinit var viewModelWithLiveData: ViewModelWithLiveData
lateinit var textView:TextView
lateinit var imageButton:ImageButton
lateinit var imageButton2:ImageButton
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
textView = findViewById(R.id.textView)
imageButton = findViewById(R.id.imageButton)
imageButton2 = findViewById(R.id.imageButton2)
viewModelWithLiveData = ViewModelProviders.of(this).get(ViewModelWithLiveData::class.java)
//LifecyclerOwener activity就是擁有LifecyclerOwener的對象
//observe 之後也不需要取消觀察, 在activity銷燬之後 系統會自動取消銷燬
viewModelWithLiveData.liveDataNumber.observe(this,object :Observer<Int> {
override fun onChanged(t: Int?) {
textView.text = t.toString()
}
})
imageButton.setOnClickListener {
viewModelWithLiveData.addLiveDataNumber(1)
}
imageButton2.setOnClickListener {
viewModelWithLiveData.addLiveDataNumber(-1)
}
}
}
observe函數非常關鍵
在控制器中對MutableLiveData 進行觀察, 那麼程序的獨立性進一步得到了提升