【发布时间】:2018-11-03 05:27:54
【问题描述】:
我在 ViewPager 中有 3 个相同的片段,每个片段都包含一个 ViewModel,每当列表发生更改时,我都会在其中观察片段的更改。
这是观察者;
mReleasesViewModel = ViewModelProviders.of(this, new ReleasesViewModelFactory(filter)).get(ReleasesViewModel.class);
// livedata
mDatabaseLoading.setVisibility(View.VISIBLE);
mReleasesViewModel.getUpcomingReleases().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();
}
mDatabaseLoading.setVisibility(View.GONE);
}
});
现在在 MainActivity 中有一个抽屉,其中包含要从例如 PC、Xbox 和 PS4 过滤的平台,当用户关闭抽屉时,我希望我的所有 3 个片段都能正常更新,这可以通过 viewmodel 完成吗?比如我如何观察列表变化和平台变化? Main Activity 中的抽屉将所选平台添加到 Integer 列表中,例如 PS4 的 id 为 3
我的视图模型:
public class ReleasesViewModel extends ViewModel {
public static final String TAG = ViewModel.class.getSimpleName();
// Example: Whenever the value contained by this MutableLiveData changes, we will set the contained value to our TextView
// Livedata objects will usually be kept in the ViewModel class
private MutableLiveData<List<_Release>> upcomingReleases;
// this field [mMonthYearFilter] is passed by our fragment to the AndroidViewModel
// to pass additional argument to my custom AndroidViewModel I need a AndroidViewModelFactory
private String monthYearFilter;
private ReleasesRepository releasesRepository;
public ReleasesViewModel(String monthYearFilter) {
this.monthYearFilter = monthYearFilter;
}
public MutableLiveData<List<_Release>> getUpcomingReleases() {
if (upcomingReleases == null) {
upcomingReleases = new MutableLiveData<>();
// User settings region & platforms
String region = SharedPrefManager.read(SharedPrefManager.KEY_PREF_REGION, "North America");
Set<String> defaultPlatformsSet = new HashSet<>();
ArrayList<Integer> platforms = SharedPrefManager.read(SharedPrefManager.PLATFORM_IDS, defaultPlatformsSet);
releasesRepository = new ReleasesRepository(region, monthYearFilter, platforms);
loadReleases();
}
return upcomingReleases;
}
private void loadReleases() {
releasesRepository.addListener(new FirebaseDatabaseRepository.FirebaseDatabaseRepositoryCallback<_Release>() {
@Override
public void onSuccess(List<_Release> result) {
upcomingReleases.setValue(result);
}
@Override
public void onError(Exception e) {
Log.e(TAG, e.getMessage());
upcomingReleases.setValue(null);
}
});
}
}
【问题讨论】:
-
对于这种情况,您应该在活动级别而不是在片段实例中初始化
ViewModel,并通过它的activity上下文在片段中使用它,它将在片段之间共享ViewModel实例。 -
我很难想象这个,这是否意味着我只需要一个视图模型?因为这三个片段中的每一个都有不同的过滤器,它们不会共享相同的数据
-
你能用更多的片段和活动代码解释一下你的用例吗?
-
我更新了我的问题并添加了我的 ViewModel,我的活动和片段就像没有任何重要的代码一样基本,我只想能够更新我的所有片段MainActivity 抽屉已关闭
标签: android android-fragments viewmodel