使用MediatorLiveData

时间:2018-12-27 13:23:57

标签: android android-livedata

有人可以解释我如何使用MediatorLiveData设计Android应用程序的不同层吗?

我有以下具体问题:我从(Room)数据库中以LiveData的形式获取约会列表(带有开始日期和结束日期)。在我看来,我想以一种标准化的方式显示约会,即约会的高度取决于持续时间,并且如果以下约会不是在第一个约会的结束日期开始的话,两个约会之间应该有“空白”

作为第二个功能,我认为日历只能以最大的整数小时开始,该小时数小于或等于几天中一组约会中最早的约会。因此,我要从数据库中获取另一个LiveData,它包含一个Calendar对象,该对象具有指定时间段内约会的最早开始日期。

我现在对具有不同抽象层的最佳设计感到困惑。

在数据层,我使用以下方法创建了一个DAO:     @道     抽象类AppointmentDao {        //在指定时间段内加载约会:        抽象的LiveData> getAppointmentsInPeriod(String startDate,String endDate);

   //Returns the minimum starttime of appointments in a specificed period:
   abstract LiveData<Calendar> getEarliestBeginning(String startDate, String endDate);
}

按照其他Android指南的建议,我创建了一个存储库层,该存储库层仅转发了DAO中的LiveData。

我现在在ViewModel上苦苦挣扎。在这里,我必须加载约会并填补它们之间的空白。 但是,应转到视图的约会列表取决于存储库中的列表以及最早的开始。 因此,我认为,这是将这些LiveData合并到MediatorLiveData中的最佳方法,该转发到视图。

所以我的方法是:

public AppointmentViewModel extends AndroidViewModel {
   AppRepository repository;

   LiveData<List<Appointment>> appointmentsFromDatabase;
   LiveData<Calendar> earliestBeginning;

   LiveData<List<Appointment>> appointmentsForView;

   public AppointmentViwModel(Application app) {
      repository = new AppRepository(app);

      appointmentsForView = new MediatorLiveData();
      appointmentsForView.addSource(appointmentsFromDatabase, appointments -> {
         if(earliestBeginning != null && earliestBeginning.getValue() != null)
            appointmentsForView = fillList(appointments, earliestBeginning.getValue());
      });

      appointmentsForView.addSource(earliestBeginning, beginning -> {
         if(appointmentsFromDatabase != null && appointmentsFromDatabase.getValue() != null && !appointmentsFromDatabase.getValue().isEmpty())
            appointmentsForView = fillList(appointmentsFromDatabase.getValue(), beginning);
      });
   }

   public LiveData<List<Appointment>> getAppointmentsInPeriod(String startDate, String endDate) {
      appointmentsFromDatabase = repository.getAppointmentsInPeriod(startDate, endDate);
      earliestBeginning = repository.getEarliestBeginning(startDate, endDate);

      return appointmentsForView;
   }

   private static LiveData<List<Appointment>> fillList(List<Appointment> appointments, Calendar beginning) {
      //Fills the gaps in the given list
   }
}

我实际上并不知道,我必须在哪里检查一个空引用和一个空集合,因为我在编程时遇到了很多异常,所以我总是在检查这些东西。

我的疑问在于MediatorLiveData的处理。在构造函数中,它指向未初始化的类变量,因为它们需要一些从视图中获取的输入值,这些值调用getAppointmentsInPeriod方法。但是此方法每次都会覆盖对象。

所以也许有人可以向我解释这种设计的最佳实践(模式)。

非常感谢您!

0 个答案:

没有答案