继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 进行观察, 那么程序的独立性进一步得到了提升