Var*_*kul 5 android mvvm viewmodel bottom-sheet android-viewmodel
我想在我的基本片段和打开的 BottomSheetDialogFragment 之间共享相同的 Viewmodel
所以这就是我如何观察这两个片段之间的相同视图模型。
BottomSheetDialogFragment
public class TasteFilterBottomDialogFragment extends BottomSheetDialogFragment {
private FilterTasteListViewModel filterTasteListViewModel;
@Inject
ViewModelProvider.Factory viewModelFactory;
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
filterTasteListViewModel = ViewModelProviders.of(getActivity(),
viewModelFactory).get(FilterTasteListViewModel.class);
filterTasteListViewModel.init();
observeViewModel(filterTasteListViewModel);
}
private void observeViewModel(FilterTasteListViewModel filterTasteListViewModel) {
filterTasteListViewModel.getFilterTastes().observe(this, new Observer<ArrayList<String>>() {
@Override
public void onChanged(@Nullable ArrayList<String> tasteList) {
// Only this one trigger when viewModel is updated
Log.d("Bottom Dialog", tasteList.toString());
filterTasteList = tasteList;
setFilterButtonState(filterTasteList);
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
我的基础片段
public class FoodListFragment extends BaseFragment {
private static TasteFilterBottomDialogFragment tasteFilterBottomDialogFragment;
@Inject
ViewModelProvider.Factory viewModelFactory;
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
showFoodListFilterButton();
if (mFoodList != null) {
mFoodListAdapter.setFoodList(mFoodList);
}
final FilterTasteListViewModel filterTasteListViewModel = ViewModelProviders.of(getActivity(),
viewModelFactory).get(FilterTasteListViewModel.class);
filterTasteListViewModel.init();
observeFilterTasteListViewModel(filterTasteListViewModel);
}
private void observeFilterTasteListViewModel(FilterTasteListViewModel filterTasteListViewModel) {
filterTasteListViewModel.getFilterTastes().observe(this, new Observer<ArrayList<String>>() {
@Override
public void onChanged(@Nullable ArrayList<String> filterTasteList) {
// This only trigger on the first time that fragment is initialise
Log.d("FoodList", filterTasteList.toString());
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
我的视图模型
public class FilterTasteListViewModel extends AndroidViewModel {
private LiveData<ArrayList<String>> filterTastesObservable;
public LiveData<ArrayList<String>> getFilterTastes() {
return this.filterTastesObservable;
}
public void setFilterTastes(ArrayList<String> filterTastes) {
((MutableLiveData<ArrayList<String>>) this.filterTastesObservable).postValue(filterTastes);
}
}
Run Code Online (Sandbox Code Playgroud)
所以当我setFilterTastes只打电话给这条线时
Log.d("Bottom Dialog", tasteList.toString());
Run Code Online (Sandbox Code Playgroud)
但实际上这条线也应该被调用(但它不是)。
Log.d("FoodList", filterTasteList.toString());
Run Code Online (Sandbox Code Playgroud)
我的问题是如何使 baseFragment 中的 observable 与BottomSheetDialogFragment 中的工作方式相同?
谢谢!
| 归档时间: |
|
| 查看次数: |
1647 次 |
| 最近记录: |