[ Android ] Get Access To ViewModel Anywhere

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

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *