Livedata如何更新某个对像中的某个属性?

假设FormBean表单对象有 30个字段。每个字段都能编辑

那么如果我在页面上只对Name字段进行修改的话,怎么更新UserForm并且触发LiveData的onChanged事件呢?

目前在网上的文章Livedata都是基本类型,没找到怎么更新某个具体的实体类的方式

public class MainViewModel extends ViewModel {
    /*
    公司的项目接近OA办公类产品,有很多表单需要填写和修改
    假设这个FormBean表单对象有 30个字段。每个字段都能编辑,如果每个字段都单独创建一个livedata对象的话,会变成很长的代码
    private MutableLiveData<String> field1;
    private MutableLiveData<String> field2;
    private MutableLiveData<String> field3;
    private MutableLiveData<String> field4;
    private MutableLiveData<String> field5;
    ........
    private MutableLiveData<String> field29;
    private MutableLiveData<String> field30;
    
    然后每个字段都要写get和set方法。每个字段都要设置observe监听,这样的代码算是最佳实践吗?
    */

    //如果只创建一个FormBean的实体类,只设置一次observe监听,但是如果更新其中的每一个字段呢?
    private MutableLiveData<FormBean> UserForm;

    public LiveData<FormBean> getCurrentUserForm() {
        if (UserForm == null) {
            UserForm = new MutableLiveData<FormBean>();
            FormBean formBean = new FormBean();
            formBean.setName("aaabbb");
            formBean.setId(123);
            UserForm.setValue(formBean);
        }
        return UserForm;
    }

    public void setField1(String userName) {
        //我目前想的方法是在set方法里先获取livedata持有的实体类,更新对应的字段后再重新setValue回去。我不知道这算不算好办法,但是暂时想不出其他办法了
        UserForm.getValue().setName(userName);
        UserForm.setValue(UserForm.getValue());
    }
}
阅读 5.5k
1 个回答

个人拙见:
现在的写法相比直接把30个字段写出来相当于加了一层代理嘛,你可以自由控制。
毕竟你把所有字段放一个类里面,最终也还是要写30个get和set的。
放到外面好处有两方面吧,一方面就参考代理模式,你不至于在数据模型里面去添加访问控制之类的,另一方面大概就是修改值和通知更新这两件事你可以分割开了,假设你要同时修改多个值,那其实有必要的话也可以只更新一次,把setValue单拿出去做一个方法就好了。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题