Android 观察对象单个属性更改的实时数据

Android 观察对象单个属性更改的实时数据,android,mvvm,android-architecture-components,Android,Mvvm,Android Architecture Components,在Android项目中,根据开发者指南成功地实现了Android架构组件,但问题是我们可以使用LiveData观察完整的对象更改 mQueViewModel.getLiveQuestion().observe(this, new Observer<Question>() { @Override public void onChanged(@Nullable Question question) { Log.i(TAG, "o

在Android项目中,根据开发者指南成功地实现了Android架构组件,但问题是我们可以使用LiveData观察完整的对象更改

  mQueViewModel.getLiveQuestion().observe(this, new Observer<Question>() {
        @Override
        public void onChanged(@Nullable Question question) {
            Log.i(TAG, "onChanged: ");
            setQuestionDetails();
        }
    });
mQueViewModel.getLiveQuestion().observe(这是一个新的观察者(){
@凌驾
更改后的公共无效(@Nullable-Question-Question){
Log.i(标记“onChanged:”);
setQuestionDetails();
}
});

任何单个对象属性更改都会在更改后触发
这会导致将所有数据重新设置到UI,因此是否有任何方法可以实现属性更改,如
onDescriptionChange
onImageChange

,这样您就可以使用ViewModel将数据拆分为更小的部分。像这样的方法应该会奏效:

private LiveData<Question> questions;
private MediatorLiveData<String> description;

public MQueViewModel() {

    description = new MediatorLiveData<>();
    description.addSource(questions, new Observer<Question>() {
        @Override
        public void onChanged(@Nullable Question question) {
            if (question == null) return;
            if (!question.description.equals(description.getValue())) {
                description.setValue(question.description);
            }
        }
    });

}
私有LiveData问题;
私有数据描述;
公共MQueViewModel(){
description=新的MediatorLiveData();
description.addSource(问题,新观察者(){
@凌驾
更改后的公共无效(@Nullable-Question-Question){
如果(问题==null)返回;
如果(!question.description.equals(description.getValue())){
说明.设定值(问题.说明);
}
}
});
}

您的用户界面已订阅
说明
。将类似的MediaLiveData添加到您需要的任何其他属性更改中。

可能已经很晚了,但您可以有两个选择


1-如前所述实现属性“Aware”MutableLiveData

2-每当属性更改时,将值设置为自身

 private  var _currentPacket = MutableLiveData<PacketEntity>()
 fun test() {
     _currentPacket.value!!.someproperty= somevalue 
     _currentPacket.value=_currentPacket.value 
  }
private var\u currentpack=MutableLiveData()
趣味测试(){
_currentPacket.value!!.someproperty=somevalue
_currentpack.value=\u currentpack.value
}

你不认为这是一个非常冗长的解决方案吗?如果我班上有20个属性,你会想吗?是的,我认为这会非常冗长。我根本不会这么做,因为在我看来这是过早的优化。但是如果你真的想,那就是方法!请建议使用类似以下内容:提供getChangedFields()、isFieldChanged(String fieldName)