繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM