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