[英]How can i send data from Activity to Fragment using LiveData and ViewModel class
[英]How can I make one ViewModel class return multiple data types to an activity or a fragment
我正在阅读这篇博文文章使用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对象的数组,然后循环遍历它以获取片段中的价格。 我根本不希望片段进行任何数据操作,只显示数据。
我看到了这个stackoverflow问题Android架构组件ViewModel可以从多个LiveData返回模型组成一个对象吗? 但我不明白答案。 我还是Java初学者。
我真的不知道我是否应该在ViewModel类中进行此数据操作
在我认为您正在使用的Android MVVM模式中,不建议在Viewmodel类中执行数据操作。 而是创建一个应该处理它的repo类。 viewModel类应该只从repo类获取数据,然后将其传递给需要它的任何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;
};
}
然后你创建一个repo类
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;
}
}
然后,您可以创建一个viewModel类
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
});
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.