我正在研究POS类型的应用程序,我试图找出处理显示用户已选择的项目总数的最佳方法。为简单起见,假设用户可以选择一个项目或取消选择它(他们不能有多个项目)。这就是我正在考虑的方法,但是我不确定这是否正确:
模型
public class Item {
public String name;
public double cost;
}
Item ViewModel
public class ItemViewModel {
private Item model;
private MutableLiveData<Boolean> isSelected;
public ItemViewModel(Item model){
this.model = model;
this.isSelected = new MutableLiveData<>(false);
}
//...isSelected getter and code to handle selection...//
}
Main ViewModel
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);
}
}
特别是可以观察另一个ViewModel吗?我这样做会冒着内存泄漏的风险吗?这是解决此类问题的错误方法吗?
我不知道某个虚拟机观察另一个虚拟机是否存在根本“错误”。但我建议您仔细看一下以下代码行:
vm.getIsSelected().observerForever(this::onSelectionChanged);
observeForever
可能不是您想要做的,因为它不尊重VM的生命周期。与使用它的组件(android / fragment)相匹配的Android VM has a lifecycle(请仔细阅读那些文档),并且该VM在该组件销毁后将继续接收更新。对我来说这听起来很漏气。
VM最好根据内部生命周期将内部VM直接暴露给活动/碎片以直接使用,以更好地使用它们。
您的VM也应继承ViewModel。