5

MVP アーキテクチャを使用し、View 側で RxJava と RxBinding を使用して Android アプリに画面を実装しようとしています。

基本的に、2 つのスピナー、1 つの TextEdit、およびデフォルトで無効になっているボタンがあります。スピナーでアイテムが選択されていて、テキスト フィールドが空でない場合にボタンを有効にしたい。コードは次のとおりです。

Observable.combineLatest(
        RxAdapterView.itemSelections(mFirstSpinner),
        RxAdapterView.itemSelections(mSecondSpinner),
        RxTextView.textChanges(mEditText),
        new Func3<Integer, Integer, CharSequence, Boolean>() {
            @Override
            public Boolean call(Integer first, Integer second, CharSequence value) {
                return !TextUtils.isEmpty(value);
            }
        }).subscribe(new Action1<Boolean>() {
        @Override
        public void call(Boolean enable) {
            mButton.setEnabled(enable);
        }
    });

問題は、それを MVP パターンに統合する方法です。理想的には、ボタンを有効にする「ビジネス ロジック」はプレゼンターにある必要があります。これを達成するための最良の方法は何ですか?元のオブザーバーを何らかの方法でプレゼンターに渡すことを考えています (副次的な質問はどのように?)。プレゼンターはそれらのオブザーバーを組み合わせて、ボタンを有効にするロジックを持ちます。最後に、View を呼び出してボタンの状態を変更するだけです。

より良いオプションはありますか?View 側に RxJava を使用した MVP の良い例はありますか?

4

2 に答える 2

5

私の提案:

あなたは正しい軌道に乗っています。ただしRxBinding、ロジックは引き続きビュー内にある必要があります。ボタンを有効にするかどうかを決定するロジックをプレゼンターに移動します。

チェックしたいすべてのフィールドの値を保持するモデルを定義します。

private class ViewValuesModel {
    public Integer adapter1Value;
    public Integer adapter2Value;
    public CharSequence textValue;

    public ViewValuesModel(Integer adapter1Value, Integer adapter2Value, CharSequence textValue) {
        this.adapter1Value = adapter1Value;
        this.adapter2Value = adapter2Value;
        this.textValue = textValue;
    }
}

ビューの内部は次を作成しますObservable:

Observable observable = Observable.combineLatest(
        RxAdapterView.itemSelections(mFirstSpinner),
        RxAdapterView.itemSelections(mSecondSpinner),
        RxTextView.textChanges(mEditText),
        new Func3<Integer, Integer, CharSequence, ViewValuesModel>() {
            @Override
            public ViewValuesModel call(Integer first, Integer second, CharSequence value) {
                return new ViewValuesModel(first, second, value);
            }
        }
)

次に、これObservableをプレゼンターに渡します。

mPresenter.observeChoosableFieldChanges(observable).

プレゼンター内で残りを行います。

observable
    .map(new Func1<ViewValuesModel, Boolean>() {
        @Override
        public Booleancall(ViewValuesModel viewStates) {
            return !TextUtils.isEmpty(viewStates.textValue);
        }
    })
    .subscribe(new Action1<Boolean>() {
        @Override
        public void call(Boolean enable) {
            if (enable) {
                view.enableButton();
            } 
        }
    });
于 2016-10-27T07:28:25.320 に答える