Ant*_*aev 5 mvp android rx-java rx-android rx-binding
我正在尝试使用MVP架构在Android应用程序中实现一个屏幕,并在View端使用RxJava和RxBinding.
基本上我有2个Spinners,1个TextEdit和一个默认禁用的按钮.我想在Spinners选择了项目且文本字段不为空时启用该按钮.这是代码:
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);
}
});
Run Code Online (Sandbox Code Playgroud)
现在的问题是如何将其整合到MVP模式中.理想情况下,启用按钮的"业务逻辑"应该在演示者中.实现这一目标的最佳方法是什么?我正在考虑将原始观察者以某种方式传递给演示者(侧面问题是如何?),演示者将组合这些观察者,并且它将具有启用按钮的逻辑.最后,它只会调用View来修改按钮状态.
还有更好的选择吗?在View端有没有RxJava MVP的好例子?
我的主张:
你走在正确的轨道上.但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;
}
}
Run Code Online (Sandbox Code Playgroud)
视图内部创建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);
}
}
)
Run Code Online (Sandbox Code Playgroud)
然后将此传递Observable给演示者:
mPresenter.observeChoosableFieldChanges(observable).
Run Code Online (Sandbox Code Playgroud)
在演示者内部做其余的事情:
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();
}
}
});
Run Code Online (Sandbox Code Playgroud)