Возникли проблемы с просмотром списка liveData в моей модели viewModel?

Я показываю маркеры из своей базы данных на своей карте, но у меня есть фильтр для пользователя, с помощью которого он может настроить время, и маркеры будут отображаться в это время. Я хочу наблюдать за списком, который обновляется каждый раз, когда пользователь меняет временной фильтр. Он выбирает время начала и время окончания, и я запрашиваю из базы данных список с этим условием. Я хочу просмотреть этот список? Как я могу это сделать?

моя ViewModel:

      public MediatorLiveData<List<LocationTracking>> fetchData(LiveData<List<LocationTracking>> source){
    if (oldSource == null){
        oldSource = source;
    } else {
        list.removeSource(oldSource);
    }
    list.addSource(source, locationTrackings -> {
        list.postValue(locationTrackings);
    });
    return list;
}

И в своей деятельности я делаю так:

Мой обратный вызов не требуется при изменении, когда в мою базу данных вставляется новое значение. Любая помощь будет высоко ценится.

Когда пользователь хочет увидеть весь список без временного фильтра.

mViewModel.fetchData(mViewModel.getFilteredLocationList(
                        mDataRange.get(0).getTimeStamp(),
                        mDataRange.get(1).getTimeStamp()
                )).observe(this,mFilteredListObserver);

Когда пользователь выбирает фильтр времени.

mViewModel.fetchData(mViewModel.getFilteredLocationList(
                data.getLongExtra(LocationsFilterActivity.START_TIME, 0),
                data.getLongExtra(LocationsFilterActivity.END_TIME, 0)
        )).observe(this,mFilteredListObserver);

person Muhammad Abdullah    schedule 22.10.2019    source источник
comment
Вы получаете маркеры из базы данных, когда впервые выходите на экран?   -  person Muhammad Awais    schedule 23.10.2019
comment
@MuhammadAwais Нет, я получаю их только одним нажатием кнопки или когда пользователь устанавливает временной диапазон.   -  person Muhammad Abdullah    schedule 23.10.2019
comment
@MuhammadAbdullah, вы решили свою проблему? Пожалуйста, дайте мне знать, поможет ли мой ответ.   -  person Wess    schedule 11.11.2019


Ответы (1)


Я боролся с подобной проблемой. Как только вы поймете решение, оно станет довольно простым. Вам нужно сделать что-то вроде этого в вашей ViewModel:

private MutableLiveData<DataRange> dataRange = new MutableLiveData<DataRange>();
public LiveData<List<LocationTracking>> list = Transformations.switchMap(dataRange, 
newDataRangeValue -> getFilteredLocationList(
        newDataRangeValue.get(0).getTimeStamp(),
        newDataRangeValue.get(1).getTimeStamp())
);

public void onDataRangeChanged(DataRange dataRange) {
    this.dataRange.setValue(dataRange);
}

В своей деятельности соблюдайте list. Метод switchMap() будет отслеживать любые изменения на dataRange, поэтому, если вы сделаете mViewModel.onDataRangeChanged(newDataRange), getFilteredLocationList() будет вызываться снова и list будет обновлен в Activity.

Я настоятельно рекомендую прочитать этот замечательный статья.

person Wess    schedule 07.11.2019