web-dev-qa-db-ja.com

AndroidViewModelからの拡張時にViewModelProvider.Factoryを使用する方法

追加のパラメーターをViewModelに送信したいのですが、これはAndroidViewModelから拡張されます。このパラメーターをViewModelFactoryクラスに追加するにはどうすればよいですか?

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
    }
}

:ドキュメントに記載されていることに気づきました:AndroidViewModelサブクラスには、Applicationを唯一のパラメーターとして受け入れるコンストラクターが必要です。

だから私がやろうとしていることをすることが可能(または良い)かどうかはわかりません。

10
mposadar

ViewModelを取得します。

        viewModel = ViewModelProviders.of(this,
                new BListFactory(getActivity().getApplication(), 1))
                .get(BListViewModel.class);

工場:

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;
    }
}
1
Andrey K