问题
I want to send an extra parameter to my ViewModel, but this extends from AndroidViewModel. How can I add this parameter to the ViewModelFactory class ?
ViewModel
class ProjectViewModel(application: Application) : AndroidViewModel(application) {
// need a param for project id...
}
ViewModelFactory
class ProjectViewModelFactory(val projectId: Int): ViewModelProvider.Factory {
override fun <T : ViewModel?> create(modelClass: Class<T>): T {
// need to send this...
return ProjectViewModel(projectId) as T
}
}
Note: I notice that in the documentation its says: AndroidViewModel Subclasses must have a constructor which accepts Application as the only parameter.
So I don't know if it is posible (or good) to do what I'm trying to do.
回答1:
Get ViewModel:
viewModel = ViewModelProviders.of(this,
new BListFactory(getActivity().getApplication(), 1))
.get(BListViewModel.class);
Factory:
class BListFactory extends ViewModelProvider.NewInstanceFactory {
@NonNull
private final Application application;
private final long id;
public BListFactory(@NonNull Application application, long id) {
this.application = application;
this.id = id;
}
@NonNull
@Override
public <T extends ViewModel> T create(@NonNull Class<T> modelClass) {
if (modelClass == BListViewModel.class) {
return (T) new BListViewModel(application, id);
}
return null;
}
}
AndroidViewModel:
public class BListViewModel extends AndroidViewModel {
private final long id;
public BListViewModel(@NonNull Application application, final long id) {
super(application);
this.id = id;
}
}
回答2:
For users looking for a Kotlin example and stumbled here:
1.) Make your ViewModel
class that accepts parameter:
class ProfileViewModel(val userId: Int): ViewModel() {
init {
Log.i("ProfileViewModel", "userId: $userId")
}
}
2.) Make your Factory class, this will also accept the parameter and pass on to your ViewModel
class ResultViewModelFactory(private val userId: Int) : ViewModelProvider.Factory {
override fun <T : ViewModel?> create(modelClass: Class<T>): T {
if (modelClass.isAssignableFrom(ResultViewModel::class.java)) {
return ResultViewModel(userId) as T
}
throw IllegalArgumentException("Unknown ViewModel class")
}
}
3.) Make two lateinit var
in your Activity/Fragment, initialise them in onCreate
/onCreateView
as
viewModelFactory = ProfileViewModelFactory(userId)
viewModel = ViewModelProviders.of(this, viewModelFactory)
.get(ProfileViewModel::class.java)
来源:https://stackoverflow.com/questions/51829280/how-to-use-a-viewmodelprovider-factory-when-extends-from-androidviewmodel