(看次篇需先看ViewModel)
经过上次可以进行一些改良,可以发现上一篇的setText偏多。也就是对数据的更新操作在展示页面上。如果可以,我们尽量把展示归展示,操作归操作。使得程序的独立性得到提示
首先,是ViewModel子类的改变:
public class MyViewModel extends ViewModel {
private MutableLiveData<Integer> liveDataNumber;
public MutableLiveData<Integer> getLiveDataNumber() {
if(liveDataNumber==null){//这里代替了空参的构造方法
liveDataNumber=new MediatorLiveData<>();
liveDataNumber.setValue(0);
}
return liveDataNumber;
}
public void addNumber(int n){
liveDataNumber.setValue(liveDataNumber.getValue()+n);
}
}
其次,我们在添加一个观察者:
viewModel.getLiveDataNumber().observe(this, new Observer<Integer>() {
@Override
public void onChanged(Integer integer) {
Log.e("TAG", "getLiveDataNumber");
tv_one.setText(String.valueOf(integer));
}
});
完整代码:
private MyViewModel viewModel;
private Button btn_one;
private Button btn_two;
private TextView tv_one;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my_live_data);
initView();
viewModel=new ViewModelProvider(this).get(MyViewModel.class);
//添加观察者,当liveDataNumber发生变化时执行
viewModel.getLiveDataNumber().observe(this, new Observer<Integer>() {
@Override
public void onChanged(Integer integer) {
Log.e("TAG", "getLiveDataNumber");
tv_one.setText(String.valueOf(integer));
}
});
initBtn();
}
private void initView() {
btn_one=(Button)findViewById(R.id.btn_one);
btn_two=(Button)findViewById(R.id.btn_two);
tv_one=(TextView)findViewById(R.id.tv_one);
}
private void initBtn() {
btn_one.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
viewModel.addNumber(1);
}
});
btn_two.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
viewModel.addNumber(2);
}
});
}