原文:https://www.jianshu.com/p/2f5bc6e9c54e
MediatorLiveData 中介者LiveData,
- 它可以监听另一个LiveData的数据变化,
- 同时也可以做为一个liveData,被其他Observer观察。
一、基本用法
ViewModel中定义MediatorLiveData
java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | 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
1 2 3 4 5 6 7 | 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | //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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 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") }; } |