如何使一个 ViewModel 类将多种数据类型返回到活动或片段



我正在阅读这篇博客文章将Android架构组件与Firebase实时数据库一起使用(第2部分(,我正在实现最后一个代码片段,以及它的工作原理。

private final FirebaseQueryLiveData liveData = new FirebaseQueryLiveData(HOT_STOCK_REF);
private final MediatorLiveData<HotStock> hotStockLiveData = new MediatorLiveData<>();
public HotStockViewModel() {
// Set up the MediatorLiveData to convert DataSnapshot objects into HotStock objects
hotStockLiveData.addSource(liveData, new Observer<DataSnapshot>() {
@Override
public void onChanged(@Nullable final DataSnapshot dataSnapshot) {
if (dataSnapshot != null) {
new Thread(new Runnable() {
@Override
public void run() {
hotStockLiveData.postValue(dataSnapshot.getValue(HotStock.class));
}
}).start();
} else {
hotStockLiveData.setValue(null);
}
}
});
}

我实际上使用它来返回包装在 LiveData 中的 HotStockViewModel 对象数组(通过循环访问数据库中的结果,我真的不知道我是否应该在 ViewModel 类中进行此数据操作(并将数组返回到仅显示它的片段。

是否可以使用相同的 ViewModel 类来返回仅包含包装在 LiveData 中的价格的数组(并且仍然返回包装在 LiveData 中的 HotStockViewModel 对象的数组(?

如果是,我该如何实现?我不想返回包装在 LiveData 中的 HotStockViewModel 对象的数组,然后遍历它以获得片段中的价格。我根本不希望片段进行任何数据操作,只显示数据。

我看到这个堆栈溢出问题 Android 架构组件视图模型可以从多个返回模型的 LiveData 中组合一个对象吗? 但我不明白答案。我仍然是Java初学者。

真的不知道我是否应该在 视图模型类

在我认为您正在使用的Android MVVM模式中,不建议在Viewmodel类中执行数据操作。 而是创建一个应该处理这个问题的存储库类。viewModel 类应仅从存储库类获取数据,然后将其传递给需要它的任何 UI 组件。

是否可以

使用相同的 ViewModel 类来返回一个数组 只有包装在 LiveData 中的价格(并且仍然返回一个数组 包装在 LiveData 中的 HotStockViewModel 对象(

您可以创建一个数据类,例如

public class ResponseData {
private ArrayList<HotStock> hotstockVm;
private ArrayList<double> prices;
public ArrayList<double> getPrices(){
return prices;
};
public void setPrices(ArrayList<double>prices ){
this.prices = prices;
};
}

然后创建一个存储库类

public class Repo{
private final FirebaseQueryLiveData liveData = new FirebaseQueryLiveData(HOT_STOCK_REF);
private final MediatorLiveData hotStockLiveData = new MediatorLiveData();
private ResponseData response = new ResponseData();
private ArrayList<HotStock> hotstock = new ArrayList<>();
private ArrayList<Double> prices = new ArrayList<>();

public LiveData<ResponseData> getData() {
//a mutableLivedata to hold data got
final MutableLivedata<ResponseData> dataMutableLiveData = new MutableLivedata<>();
// Set up the MediatorLiveData to convert DataSnapshot objects into HotStock objects
hotStockLiveData.addSource(liveData, new Observer() {
@Override
public void onChanged(@Nullable final DataSnapshot dataSnapshot) {
if (dataSnapshot != null) {
new Thread(new Runnable() {
@Override
public void run() {
hotStockLiveData.postValue(dataSnapshot.getValue(HotStock.class));
//get each hotstock object from firebase
HotStock object = dataSnapshot.getValue(HotStock.class);
//get the price from each hotstock object
//if class HotStock has arrays of inner class where price is, then loop to get price.
//assign price to a new list
//assign also hotstock to a new list.
prices.add(object.getPrice);
hotstock.add(object);
//set the value of all
response.setHotstock(hotstock);
response.setPrices(prices);
dataMutableLiveData.postValue(response);
}
}).start();
} else {
hotStockLiveData.setValue(null);
}
}
});
return dataMutableLiveData;
}
}

然后,您可以创建一个视图模型类

public class AppViewModel extends ViewModel{
private LiveData<ResponseData> dataLiveData;
private Repo appRepo;
public AppViewModel(){
appRepo = new Repo();
}
public LiveData<ResponseData> getLiveData(){
if(dataLiveData == null){
dataLiveData = appRepo.getData();
return dataLiveData;
}
}
}

用法

public class MainActivity extends Activity{
AppViewModel appViewModel;
public void onCreate(Bundle SavedInstanceState){
super.onCreate(SavedInstanceState);
appViewModel = ViewModelProviders.of(this).get(AppViewModel.class);
appViewModel.getLiveData().observe(this,response -> {
//here response is an object of type ResponseData.
//in this response object you can get your arraylist of prices and also arraylist of hotstock

});
}
}

最新更新