Как изменить экземпляр данных в режиме реального времени? - PullRequest
1 голос
/ 25 марта 2019

Я устанавливаю запрос помещения в onCreate (), который возвращает экземпляр живых данных, который я наблюдаю в следующем.

viewModel.setmQueryMediaList(null, MediaUtils.DATE_TAKEN_KEY, MediaUtils.DATE_TAKEN_KEY);

viewModel.getmQueryMediaList().observe(MainActivity.this, new Observer<List<MediaStoreData>>() {
        @Override
        public void onChanged(@Nullable List<MediaStoreData> mediaStoreDataList) {
            List<MediaStoreData> sectionedMediaStoreDataList = MediaUtils.getSectionedList(getBaseContext(), mediaStoreDataList, MediaUtils.ORDER_BY_MONTH );
            mRecyclerViewAdapter.submitList(sectionedMediaStoreDataList);
            Log.e("MediaDatabase", "something changed! Size:" + (mediaStoreDataList != null ? mediaStoreDataList.size() : 0));
        }
    });

onClick() Я хочу изменить запрос помещения, и я предположил, что наблюдатель запускает это изменение, но это не так.

@Override
public void onAlbumClicked(AlbumData albumData, TextView titleView) {
    viewModel.setmQueryMediaList(albumData.getDirectory_path(), null, MediaUtils.DATE_TAKEN_KEY);
    mSlidingUpPanelLayout.setPanelState(SlidingUpPanelLayout.PanelState.EXPANDED);
}

Это в моем классе ViewModel

public void setmQueryMediaList(String directory_path, String sectionOrder, String sortOrder) {
    if(directory_path != null){
        this.mQueryMediaList = mediaDatabase.mediaDao().getAllByName();
    } else {
        this.mQueryMediaList = mediaDatabase.mediaDao().getAllByDate();
    }
}

public LiveData<List<MediaStoreData>> getmQueryMediaList(){
    return mQueryMediaList;
}

Есть идеи, что я делаю не так?

Ответы [ 2 ]

1 голос
/ 28 марта 2019

Правильный способ сделать это - поместить directoryPath в MutableLiveData<String>, а затем Transformations.switchMap, чтобы обновить LiveData, который вы на самом деле наблюдаете из своей деятельности / фрагмента.

public void setmQueryMediaList(String directoryPath, String sectionOrder, String sortOrder) {
    directoryPathLiveData.setValue(directoryPath);
}

mQueryMediaList = Transformations.switchMap(directoryPathLiveData, (directoryPath) -> {
    if(directory_path != null){
        return mediaDatabase.mediaDao().getAllByName();
    } else {
        return mediaDatabase.mediaDao().getAllByDate();
    }
});
1 голос
/ 25 марта 2019

Ваша проблема в том, что вы заменяете Объект, к которому прикреплен Наблюдатель. Это означает, что вы, Obserers, не привязаны к вашему новому QueryMediaList, поэтому вам придется сбрасывать их каждый раз, когда вы меняете Query. Для этого вы можете извлечь ваш Observer в его собственную переменную, а затем снова присоединить эту переменную к списку после изменения запроса.

...