有没有办法将其他parameter passing给我的自定义AndroidViewModel构造函数,除了Application上下文。 例:
public class MyViewModel extends AndroidViewModel { private final LiveData myObjectList; private AppDatabase appDatabase; public MyViewModel(Application application, String param) { super(application); appDatabase = AppDatabase.getDatabase(this.getApplication()); myObjectList = appDatabase.myOjectModel().getMyObjectByParam(param); } }
当我想要使用我的自定义ViewModel类时,我在我的片段中使用此代码:MyViewModel myViewModel = ViewModelProvider.of(this).get(MyViewModel.class)
所以我不知道如何将额外的参数String param传递给我的自定义ViewModel 。 我只能传递Application上下文,但不能传递其他参数。 我真的很感激任何帮助。 谢谢。
编辑:我添加了一些代码。 我希望现在好多了。
您需要为ViewModel创建工厂类。
public class MyViewModelFactory extends ViewModelProvider.NewInstanceFactory { private Application mApplication; private String mParam; public MyViewModelFactory(Application application, String param) { mApplication = application; mParam = param; } @Override public T create(ClassmodelClass) { return (T) new MyViewModel(mApplication, mParam); } }
在实例化视图模型时,您会这样做:
MyViewModel myViewModel = ViewModelProviders.of(this, new MyViewModelFactory(this.getApplication(), "my awesome param")).get(MyViewModel.class);
对于在多个不同视图模型之间共享的一个工厂,我会扩展mlyko的答案,如下所示:
public class MyViewModelFactory extends ViewModelProvider.NewInstanceFactory { private Application mApplication; private Object[] mParams; public MyViewModelFactory(Application application, Object... params) { mApplication = application; mParams = params; } @Override public T create(ClassmodelClass) { if (modelClass == ViewModel1.class) { return (T) new ViewModel1(mApplication, (String) mParams[0]); } else if (modelClass == ViewModel2.class) { return (T) new ViewModel2(mApplication, (Integer) mParams[0]); } else if (modelClass == ViewModel3.class) { return (T) new ViewModel3(mApplication, (Integer) mParams[0], (String) mParams[1]); } else { return super.create(modelClass); } } }
并实例化视图模型:
ViewModel1 vm1 = ViewModelProviders.of(this, new MyViewModelFactory(getApplication(), "something")).get(ViewModel1.class); ViewModel2 vm2 = ViewModelProviders.of(this, new MyViewModelFactory(getApplication(), 123)).get(ViewModel2.class); ViewModel3 vm3 = ViewModelProviders.of(this, new MyViewModelFactory(getApplication(), 123, "something")).get(ViewModel3.class);
具有不同构造函数的不同视图模型。