• Jetpack之LiveData扩展MediatorLiveData


    LiveData的使用前面已经说过:

    Android Jetpack组件之 LiveData使用-源码

    但是Android库里也有一些扩展类,比如 MediatorLiveData 需要介绍下。


    假设有一个需求:在ExitText中输入文字的同时,显示文字个数。当然可以用EditTextChangeListener,也可以只用一个LiveData监听输入String也可以得到length,但是这里只是举例嘛。

    1. class MainViewModel : ViewModel() {
    2. val message: MutableLiveData<String> = MutableLiveData()
    3. val count: MediatorLiveData<Int> = MediatorLiveData()
    4. init {
    5. count.value = 0
    6. count.addSource(message) {
    7. val cnt = message.value?.length ?: 0
    8. count.postValue(cnt)
    9. }
    10. }
    11. fun postMessage(message: String) {
    12. this.message.postValue(message)
    13. }
    14. }

    MediatorLiveDarta的作用,顾名思义可以作为中间人的角色监听其他LiveData。这里可以在EditText的回调里通过postMessage更新message,count通过addSource监听message的变化后更新输入长度。

     用Java版本看看:

    例如:从getNameFromServer()取的值是"alan",而MediatorLiveData做了转化后成了"alan gong"。

    1. public class MyViewModel extends ViewModel {
    2. private MutableLiveData<String> liveEvent;
    3. private MediatorLiveData<String> testLiveData;
    4. public MyViewModel() {
    5. testLiveData = new MediatorLiveData<>();
    6. testLiveData.addSource(liveEvent, new Observer<String>() {
    7. @Override
    8. public void onChanged(String s) {
    9. testLiveData.postValue(s + " gong");
    10. }
    11. });
    12. getNameFromServer();
    13. }
    14. public MediatorLiveData<String> getTestLiveData() {
    15. return testLiveData;
    16. }
    17. private void getNameFromServer() {
    18. if (liveEvent == null) {
    19. liveEvent = new MutableLiveData<>();
    20. }
    21. liveEvent.setValue("alan");
    22. }
    23. }
    24. public class MainActivity extends AppCompatActivity {
    25. private ActivityMainBinding binding;
    26. @Override
    27. protected void onCreate(Bundle savedInstanceState) {
    28. super.onCreate(savedInstanceState);
    29. binding = ActivityMainBinding.inflate(LayoutInflater.from(this));
    30. setContentView(binding.getRoot());
    31. ViewModelProvider provider = new ViewModelProvider(this, new ViewModelProvider.NewInstanceFactory());
    32. MyViewModel myViewModel = provider.get(MyViewModel.class);
    33. binding.setViewModel(myViewModel);
    34. myViewModel.getTestLiveData().observe(this, new Observer<String>() {
    35. @Override
    36. public void onChanged(String s) {
    37. textView.setText(s);
    38. }
    39. });
    40. }
    41. }

    至于原理,相信会使用LiveData的都觉得没什么,studio里点这个类进入源码看看就行了。

  • 相关阅读:
    A-Level经济真题(8)
    敦煌网“星云计划”:助商家开拓新流量和新玩法,测评补单快速提高产品排名和销量
    【三维重建】Ubuntu18.04安装COLMAP
    python面试学习
    java中PriorityQueue队列的使用
    virtualbox报错
    布隆过滤器的使用场景
    新手入门案例学习,基于C# MVC实现汽修管理系统《建议收藏:附完整源码+数据库》
    9.20日报
    MQ消息队列篇:三大MQ产品的必备面试种子题
  • 原文地址:https://blog.csdn.net/Jason_Lee155/article/details/125533897