Android Studio 之 LiveData 的配合使用,底層數據變化,自動通知界面
viewModelWithLikeData.getLikeNumber().observe(this, new Observer<Integer>() {
@Override
public void onChanged(Integer integer) {
textView.setText(String.valueOf(integer));
}
});
通過 ViewModel 對象方法的 observe onChanged事件,自動對界面上的控件,進行數據更新
1.ViewModel類
創建 對象 MutableLiveData<Integer> likeNumber
創建 這個對象的 GET 、 SET 方法
package com.example.livedatatest;
import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel;
public class ViewModelWithLikeData extends ViewModel {
private MutableLiveData<Integer> likeNumber;
//用構造函數,防止訪問到的內容是空的,不能這樣用,不知道為什么,會出錯
/*
ViewModelWithLikeData(){
likeNumber = new MutableLiveData<>();
likeNumber.setValue(0);
}
*/
public MutableLiveData<Integer> getLikeNumber() {
if(likeNumber==null) {
likeNumber = new MutableLiveData<>();
likeNumber.setValue(0);
}
return likeNumber;
}
public void setLikeNumber(MutableLiveData<Integer> likeNumber) {
this.likeNumber = likeNumber;
}
public void addLikeNumber(int n) {
likeNumber.setValue(likeNumber.getValue()+n);
}
}
2. Activity 類
創建 ViewModel 對象,實例化對象
對 ViewModel 對象的 observe onChanged 事件進行監控,如有變化,就自動給控件賦值!
package com.example.livedatatest;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageButton;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProviders;
public class MainActivity extends AppCompatActivity {
ViewModelWithLikeData viewModelWithLikeData;
TextView textView;
ImageButton imageButton1;
ImageButton imageButton2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = findViewById(R.id.textView);
imageButton1 = findViewById(R.id.imageButton);
imageButton2 = findViewById(R.id.imageButton2 );
//注意: ViewModelProviders 必須在 build.gradle 中引入如下語句,否則導入不了類
//implementation 'androidx.lifecycle:lifecycle-extensions:2.1.0'
viewModelWithLikeData = ViewModelProviders.of(this).get(ViewModelWithLikeData.class);
//設置一個監聽器,當這個值有變化時,自動給控件賦值。
viewModelWithLikeData.getLikeNumber().observe(this, new Observer<Integer>() {
@Override
public void onChanged(Integer integer) {
textView.setText(String.valueOf(integer));
}
});
imageButton1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
viewModelWithLikeData.addLikeNumber(1); //點贊加1
}
});
imageButton2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
viewModelWithLikeData.addLikeNumber(-1); //踩-1
}
});
}
}