如何同时更新所有实时数据?

时间:2018-11-09 05:09:23

标签: android viewmodel android-livedata

当应用检测到用户在抽屉式布局关闭侦听器上更改的过滤器时,我想在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方法,并且在此方法内部,它将跳过整个侦听器{{ 1}}出于某种原因。

在我监听数据变化的片段中,我有以下简单的观察者:

addListener

当我在抽屉关闭时在ViewModel中调用我的update all方法时,将调用片段中观察者内部的代码(返回的列表为空),但是我希望它调用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); } }); 来更新所有内容..关于如何同时更新所有当前实时数据并将其反映在UI上的想法?

0 个答案:

没有答案