textview java_Rxjava之RxTextView经典详解

本文介绍了如何使用RxJava的RxTextView进行文本变化监听,结合Latest方法处理两个输入框的价格和数量,动态计算总预计收入,并实现卖出按钮的启用与禁用状态。通过实例解析RxJava的使用,简化了传统监听回调的复杂性。
摘要由CSDN通过智能技术生成

大家都知道Rxjava神通广大,无所不能,并有效避免Call Hell(回调地狱)模式,使大量的监听事件clickListener变换成流式编程,提高代码阅读性,提升代码维护成本。今天我通过例子详解Rxjava中的RxTextview详解,让你一举搞懂Rxjava用法,语法以及操作实例(明白 简单掌握)。

实际用户场景举例

fc6f09c2a3ef

根据用户输入的价格(价格范围0.-1)、输入的数量(10-无限)计算出总预计收入,如果写错了(举例价格范围错误、数量不对)卖出按钮无效(disable).

如果用传统的edittext.setOnChangeListner要加两个,动态计算较为难以理解。用Rxjava 则合并两个动态计算的Observable,最后动态算出结果,代码如下。

Observable priceObservable = RxTextView.textChanges(priceEdit.getEditText());

Observable countObservable = RxTextView.textChanges(countEdit.getEditText());

sellBtnSubscription = Observable.combineLatest(priceObservable, countObservable,

(priceSequence, countSequence) -> {

if (priceSequence.toString().startsWith(".")) {

priceSequence = "0" + priceSequence;

priceEdit.setText("0.");

priceEdit.getEditText().setSelection(priceEdit.getText().length());

}

double inputPrice = StringUtils.isEmpty(priceSequence.toString()) ? 0 : Double.parseDouble(priceSequence.toString());

int inputCount = StringUtils.isEmpty(countSequence.toString()) ? 0 : Integer.parseInt(countSequence.toString());

return inputPrice > 0 && inputCount > 0;

}).subscribe(new Observer() {

@Override

public void onCompleted() {

}

@Override

public void onError(Throwable e) {

e.printStackTrace();

}

@Override

public void onNext(Boolean isSellBtnEnable) {

sellBtn.setEnabled(isSellBtnEnable);

String handFeetStr = "(含手续费)";

if (isSellBtnEnable) {

double predictedIncome = Double.parseDouble(priceEdit.getText().toString()) * Integer.parseInt(countEdit.getText());

predictedIncomeTv.setText(FormatUtil.formatMoney(predictedIncome) + "元"); //卖出联豆的预计收入(没有去除手续费的预估收入)

//( 含手续费 )

if (predictedIncome == 0) {

predictedIncomeTv.setText(FormatUtil.formatMoney(predictedIncome) + "元"); //卖出联豆的预计收入(没有去除手续费的预估收入)

} else {

predictedIncomeTv.setText(FormatUtil.formatMoney(predictedIncome) + "元" + handFeetStr); //卖出联豆的预计收入(没有去除手续费的预估收入)

}

} else {

predictedIncomeTv.setText(FormatUtil.formatMoney(0) + "元"); //卖出联豆的预计收入

}

}

});

}

简单详解:

获得两个EditText的 可被观察对象

获得两个edittext的可被观察的(observable对象

Observable priceObservable =

RxTextView.textChanges(priceEdit.getEditText());

Observable countObservable =

RxTextView.textChanges(countEdit.getEditText());

综合运算

动态算出 价格、数量是否合理

sellBtnSubscription = Observable.combineLatest(priceObservable, countObservable,

(priceSequence, countSequence) -> {

if (priceSequence.toString().startsWith(".")) {

priceSequence = "0" + priceSequence;

priceEdit.setText("0.");

priceEdit.getEditText().setSelection(priceEdit.getText().length());

}

double inputPrice = StringUtils.isEmpty(priceSequence.toString()) ? 0 : Double.parseDouble(priceSequence.toString());

int inputCount = StringUtils.isEmpty(countSequence.toString()) ? 0 : Integer.parseInt(countSequence.toString());

return inputPrice > 0 && inputCount > 0;

}).subscribe(new Observer() {

@Override

public void onCompleted() {

}

@Override

public void onError(Throwable e) {

e.printStackTrace();

}

@Override

public void onNext(Boolean isSellBtnEnable) {

sellBtn.setEnabled(isSellBtnEnable);

String handFeetStr = "(含手续费)";

if (isSellBtnEnable) {

double predictedIncome = Double.parseDouble(priceEdit.getText().toString()) * Integer.parseInt(countEdit.getText());

predictedIncomeTv.setText(FormatUtil.formatMoney(predictedIncome) + "元"); //卖出XX币的预计收入(没有去除手续费的预估收入)

//( 含手续费 )

if (predictedIncome == 0) {

predictedIncomeTv.setText(FormatUtil.formatMoney(predictedIncome) + "元"); //卖出XX币的预计收入(没有去除手续费的预估收入)

} else {

predictedIncomeTv.setText(FormatUtil.formatMoney(predictedIncome) + "元" + handFeetStr); //卖出XX币的预计收入(没有去除手续费的预估收入)

}

} else {

predictedIncomeTv.setText(FormatUtil.formatMoney(0) + "元"); //卖出联豆的预计收入

}

}

});

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值