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