原文:https://www.jianshu.com/p/2f5bc6e9c54e
MediatorLiveData 中介者LiveData,
- 它可以監聽另一個LiveData的數據變化,
- 同時也可以做爲一個liveData,被其他Observer觀察。
一、基本用法
ViewModel中定義MediatorLiveData
java
public class TanViewModel extends ViewModel {
private MutableLiveData<String> mNameEvent = new MutableLiveData<>();
public MutableLiveData<String> getNameEvent() {
return mNameEvent;
}
public MediatorLiveData myMediatorLiveData=new MediatorLiveData();
public TanViewModel(){
myMediatorLiveData.addSource(mNameEvent, new Observer<String>() {
@Override
public void onChanged(@Nullable String s) {
String tempStr=mNameEvent.getValue();
myMediatorLiveData.postValue(tempStr.length());
}
});
}
public void getData(int num){
String name="tan"+num;
Integer age=111;
mNameEvent.postValue(name);
}
}
kotlin
val mediator = MediatorLiveData<List<String>>();
val strLive = MutableLiveData<List<String>>();
//(1)爲mediator addSource,監聽其他的liveData
mediator.addSource(strLive, Observer {
Log.i("ccccccccccc","onchange"+it.size);
mediator.value = it
})
Activity
java
//onCreate
mTestViewModel = ViewModelProviders.of(this).get(TanViewModel.class);
mTestViewModel.getNameEvent().observe(this, new Observer<String>() {
@Override
public void onChanged(@Nullable String s) {
Log.w("tan","getNameEvent="+s);
}
});
mTestViewModel.myMediatorLiveData.observe(this, new Observer() {
@Override
public void onChanged(@Nullable Object o) {
Log.w("tan","myMediatorLiveData="+o);
if(o instanceof String){
Log.w("tan","String="+o);
}else if(o instanceof Integer){
Log.w("tan","Integer="+o);
}
}
});
//button單擊事件調用下面方法
num*=10;
mTestViewModel.getData(num);;
kotlin
class MainActivity : FragmentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
//(2)監聽mediaLiveData
viewModel.mediator.observe(this, Observer {
Log.i("ccccccccc","size==="+it.size)
})
binding.btnGotoGarden.setOnClickListener{
viewModel.strLive.value = arrayListOf("1","22","333","4444","55555")
};
}