Как обновить все живые данные одновременно? - PullRequest
0 голосов
/ 09 ноября 2018

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

Вот моя ViewModel:

public class ReleasesViewModel extends ViewModel {
    private HashMap<String, MutableLiveData<List<_Release>>> upcomingReleasesListMap = new HashMap<>();
    private ReleasesRepository releasesRepository;
    private ArrayList<Integer> platforms;
    private ArrayList<Integer> platformsCopy;
    private String region;

    public ReleasesViewModel() {
        upcomingReleasesListMap = new HashMap<>();
        // Shared to all fragments : User settings region & platforms
        region = SharedPrefManager.read(SharedPrefManager.KEY_PREF_REGION, "North America");
        Set<String> defaultPlatformsSet = new HashSet<>();
        platforms = SharedPrefManager.read(SharedPrefManager.PLATFORM_IDS);
        if (platformsCopy == null) {
            // Set only once [past copy of platforms]
            platformsCopy = SharedPrefManager.read(SharedPrefManager.PLATFORM_IDS);
        }
    }

    public MutableLiveData<List<_Release>> getUpcomingReleases(String filter) {
        // ReleasesRepository takes a different monthly filter
        if (upcomingReleasesListMap.get(filter) == null) {
            // we don't have a mapping for this filter so create one in the map
            MutableLiveData<List<_Release>> releases = new MutableLiveData<>();
            upcomingReleasesListMap.put(filter, releases);
            // also call this method to update the LiveData
            loadReleases(filter);
        } else if (upcomingReleasesListMap.containsKey(filter)) {
            // Double check if it isn't null, just in case
            if (upcomingReleasesListMap.get(filter) == null || isPlatformsUpdated()) {
                // if null; try again to update the live data or if platforms filter changed
                loadReleases(filter);
            } // else just don't do anything, the list is already in the Map
        }

        return upcomingReleasesListMap.get(filter);
    }

    private void loadReleases(final String filter) {
        releasesRepository = new ReleasesRepository(region, filter, platforms);
        releasesRepository.addListener(new FirebaseDatabaseRepository.FirebaseDatabaseRepositoryCallback<_Release>() {
            @Override
            public void onSuccess(List<_Release> result) {
                // sort by release date
                if (platforms.size() > 1) {
                    // Will only sort for multiple platforms filter
                    Collections.sort(result);
                }
                // just use the previous created LiveData, this time with the data we got
                MutableLiveData<List<_Release>> releases = upcomingReleasesListMap.get(filter);
                releases.setValue(result);
            }

            @Override
            public void onError(Exception e) {
                // Log.e(TAG, e.getMessage());
                MutableLiveData<List<_Release>> releases = upcomingReleasesListMap.get(filter);
                releases.setValue(null);
            }
        });
    }

    // Detects when user added/removed platform to update lists based on platforms
    private boolean isPlatformsUpdated() {
        Collections.sort(platforms);
        Collections.sort(platformsCopy);
        if (platforms.equals(platformsCopy)) {
            // nothing new added since past update
            return false;
        }
        // something new added or removed, change
        platformsCopy = SharedPrefManager.read(SharedPrefManager.PLATFORM_IDS);
        return true;
    }

    public void updateAllReleasesList() {
        // update all releases live data lists
        for (String filter : upcomingReleasesListMap.keySet()) {
            loadReleases(filter);
        }
    }
}

updateAllReleasesList - это метод, который я создал, чтобы обновить все мои списки жизненных данных, но при вызове этого метода он снова вызовет метод loadReleases, и внутри этого метода он пропустит весь код addListener слушателя для некоторых причина.

В моих фрагментах, где я слушаю изменения данных, у меня есть следующий простой наблюдатель:

mReleasesViewModel = ViewModelProviders.of(getActivity()).get(ReleasesViewModel.class);
    mReleasesViewModel.getUpcomingReleases(filter).observe(this, new Observer<List<_Release>>() {
        @Override
        public void onChanged(@Nullable List<_Release> releases) {
            // whenever the list is changed
            if (releases != null) {
                mUpcomingGamesAdapter.setData(releases);
                mUpcomingGamesAdapter.notifyDataSetChanged();
                Toast.makeText(getContext(), "Updated", Toast.LENGTH_SHORT).show();
            }
            mDatabaseLoading.setVisibility(View.GONE);
        }
    });

И когда я вызываю мой метод update all в моей ViewModel при закрытии ящика, вызывается код внутри наблюдателя в моем фрагменте (возвращенный список пуст), но я хочу, чтобы он вызывал getUpcomingReleases, чтобы обновить все .. Любые идеи о том, как обновить все мои текущие liveatas одновременно и отразить это на пользовательском интерфейсе?

...