ViewModel with generic type

Viewed 2335

How can i create a viewModel with a generic type? Let me show you an example:

ViewModel

public class MyViewModel<T> extends ViewModel
{
    private Repository<T> repository;

    ...

    @Override
    public LiveData<Model<T>> getModel()
    {
        return repository.getModel();
    }
}

Fragment

        private MyViewModel<T> viewModel;

        ...

        @Override
        public void onActivityCreated(@Nullable Bundle savedInstanceState)
        {
            super.onActivityCreated(savedInstanceState);

            // this is where i need my viewModel with the generic type
            viewModel = ViewModelProviders.of(this).get(MyViewModel.class);
        }

As you can see, i am unable to get the sepecified viewModel i initialized as a variable in my fragment Maybe someone can lead me in the right direction, thanks.

1 Answers

I know this question asked a long time ago but for anyone else who has same problem you should use a factory class to send your own constructor to a view model class ( in Kotlin Code):

//Your view model
class BaseViewModel<K1, K2> : ViewModel() {
}

a factory class that extend ViewModelProvider.Factory:

    class BaseViewModelFactory<K1,K2>:ViewModelProvider.Factory {
    override fun <T : ViewModel?> create(modelClass: Class<T>): T {
        return BaseViewModel<K1,K2>() as T
    }
}

and declare your view model in activity or fragment as below:

val viewmodel=ViewModelProvider(this, BaseViewModelFactory<K1, K2>())
            .get(BaseViewModel::class.java) as BaseViewModel<K1, K2>
Related