• 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里点这个类进入源码看看就行了。

  • 相关阅读:
    js教程(12)——本地储存
    易周金融 | Q1保险行业活跃人数8688.67万人 19家支付机构牌照被注销
    mysql精简单机版,免登录,可复制,不启动服务,与本机mysql无冲突
    神经网络滤镜安装教程图,ps神经网络滤镜安装包
    Python爬取数据分析
    JavaScript从入门到精通|函数
    UML图及在drawio中的绘制
    java-php-python--移动公司crm客户关系管理系统开发与实现-计算机毕业设计
    蓝桥杯-修建灌木
    从电子组态到原子态
  • 原文地址:https://blog.csdn.net/Jason_Lee155/article/details/125533897