We need some class to get access to our view models:
public class ViewModelsUtil { private static ViewModelsUtil _instance; private WeakHashMap<Class, BaseViewModel> _models=new WeakHashMap<>(); // http://class.expert/blog/ public static ViewModelsUtil getInstance() { if(_instance==null) _instance=new ViewModelsUtil(); return _instance; } public void add(BaseViewModel model) { _models.put(model.getClass(),model); } public <T extends BaseViewModel> T get(Class<T> model) { return (T)_models.get(model); } }
Let’s define base model that will be common for any others view models:
public abstract class BaseViewModel<T extends ViewDataBinding> extends BaseObservable { // http://class.expert/blog/ protected T _binding; public T getBinding() { return _binding; } public BaseViewModel(final T binding) { _binding=binding; ViewModelsUtil.getInstance().add(this); // adding our models } public Context getContext() { return _binding.getRoot().getContext(); } public void Toast(String msg) { Toast.makeText(getContext(), msg, Toast.LENGTH_SHORT).show(); } }
Now we declare some specific view model that will extend our base model:
public class MainViewModel extends BaseViewModel<MainViewBinding> { public MainViewModel(final MainViewBinding binding) { super(binding); } }
After all, in View we creating a view model and can get it anywhere. For better perfomance you should get it in some variable, to prevent many search operations.
binding = DataBindingUtil.setContentView(this, R.layout.main_view); model = new MainViewModel(binding); //ViewModelsUtil.mainVB=model; ViewModelsUtil.getInstance().add(model); binding.setViewModel(model); //.... // Anywhere MainViewModel mvm = ViewModelsUtil.getInstance().get(MainViewModel.class)
Also, you can just use Class Expert MVVM Library