Android 从ViewModel观察其他ViewModel
我正在开发一个POS类型的应用程序,我试图找出最好的方式来处理显示用户选择的项目总数。为了简单起见,假设用户可以选择一个项目或取消选择它(他们不能有多个项目)。这是我正在考虑的,但我不确定这是否正确: 模型 项目视图模型Android 从ViewModel观察其他ViewModel,android,android-livedata,android-viewmodel,Android,Android Livedata,Android Viewmodel,我正在开发一个POS类型的应用程序,我试图找出最好的方式来处理显示用户选择的项目总数。为了简单起见,假设用户可以选择一个项目或取消选择它(他们不能有多个项目)。这是我正在考虑的,但我不确定这是否正确: 模型 项目视图模型 公共类ItemViewModel{ 私人物品模型; 选择私有可变LiveData; 公共项目视图模型(项目模型){ this.model=模型; this.isSelected=新的可变LiveData(false); } //…我选择了getter和代码来处理选择// }
公共类ItemViewModel{
私人物品模型;
选择私有可变LiveData;
公共项目视图模型(项目模型){
this.model=模型;
this.isSelected=新的可变LiveData(false);
}
//…我选择了getter和代码来处理选择//
}
主视图模型
public类主视图模型{
私有最终可变LiveData项;
私有最终可变LiveData总成本;
公共主视图模型(列表项){
List viewModels=new ArrayList();
用于(项目:项目){
ItemViewModel vm=新的ItemViewModel(项目);
vm.getIsSelected().observerForever(this::onSelectionChanged);
viewModels.add(vm);
}
this.items=新的可变LiveData(viewModels);
this.totalCost=新的可变LiveData(0.00d);
}
私有void onSelectionChanged(布尔值){
双倍总计=0.00d;
//…总计所有选定项目//
此值为.totalCost.postValue(总计);
}
}
具体来说,观察另一个ViewModel可以吗?我这样做是否有内存泄漏的风险?这是处理此类问题的错误方法吗?我不知道一个虚拟机观察另一个虚拟机是否有任何根本的“错误”。但我建议仔细看看这一行代码:
vm.getIsSelected().observerForever(this::onSelectionChanged);
observeforver
可能不是您想要做的,因为它不尊重虚拟机的生命周期。一个Android虚拟机(仔细阅读这些文档),它与使用它的组件(Android/fragment)匹配,并且这个虚拟机将在该组件被销毁后继续接收更新。对我来说这听起来有点漏洞百出
对于VM来说,根据其自身的生命周期,最好将内部VM直接暴露给要直接使用的活动/片段
你的虚拟机也应该子类化。我不知道一个虚拟机观察另一个虚拟机是否有什么根本的“错误”。但我建议仔细看看这一行代码:
vm.getIsSelected().observerForever(this::onSelectionChanged);
observeforver
可能不是您想要做的,因为它不尊重虚拟机的生命周期。一个Android虚拟机(仔细阅读这些文档),它与使用它的组件(Android/fragment)匹配,并且这个虚拟机将在该组件被销毁后继续接收更新。对我来说这听起来有点漏洞百出
对于VM来说,根据其自身的生命周期,最好将内部VM直接暴露给要直接使用的活动/片段
你的虚拟机也应该是子类
public class MainViewModel {
private final MutableLiveData<List<ItemViewModel>> items;
private final MutableLiveData<Double> totalCost;
public MainViewModel(List<Item> items){
List<ItemViewModel> viewModels = new ArrayList<>();
for(Item item : items) {
ItemViewModel vm = new ItemViewModel(item);
vm.getIsSelected().observerForever(this::onSelectionChanged);
viewModels.add(vm);
}
this.items = new MutableLiveData<>(viewModels);
this.totalCost = new MutableLiveData<>(0.00d);
}
private void onSelectionChanged(Boolean value){
double total = 0.00d;
//...total all selected items...//
this.totalCost.postValue(total);
}
}
vm.getIsSelected().observerForever(this::onSelectionChanged);