所以在我的应用程序的一个活动中,我有listView,它包含一个EditText,用户输入一个数量,我想在其中一个textViews中显示总金额。我尝试的方式是将TextWatcher附加到listViews EditText,就像这样
CustomWatcher oldWatcher = (CustomWatcher) holder.tvDonationAmount.getTag();
if (oldWatcher != null)
holder.tvDonationAmount.removeTextChangedListener(oldWatcher);
CustomWatcher newWatcher = new CustomWatcher();
holder.tvDonationAmount.setTag(newWatcher);
holder.tvDonationAmount.addTextChangedListener(newWatcher);
我的自定义TextWatcher代码是这样的:
public class CustomWatcher implements TextWatcher {
int sum, amount;
FinalDTAdapter finalDTAdapter;
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void afterTextChanged(Editable editable) {
if (editable.toString().length() > 0) {
amount = Integer.parseInt(editable.toString());
}
GenRecNew.addn.add(amount);
System.out.println("amount :" + amount);
for (int i = 0; i < GenRecNew.addn.size(); i++) {
sum += GenRecNew.addn.get(i);
}
String res = String.valueOf(sum);
GenRecNew.mFinalDonationAmount.setText(res);
}}
GenRec.addn是一个整数的ArrayList。 所以我在这里推送ArrayList中的输入量,然后计算数组中所有元素的总和。问题是当我输入数量示例时:数组中的500推送5然后推送50然后500并且总计算量错误。你能帮助我把最终数量输入数组吗?我知道onFocusChangeListner有帮助,但请告诉我如何,无法弄明白。提前谢谢。
答案 0 :(得分:1)
这里的问题是TextWatcher
立即处理数据。您需要做的是去抖动操作,以便仅在完成某个延迟时才进行计算。您可以使用计时器来实现此目的(或者如果您在应用程序中使用Rx,则使用RxTextView的去抖动操作)。以下是如何在vanilla Android代码中执行此操作:
public class CustomWatcher implements TextWatcher {
private Timer timer = new Timer();
private final long DELAY = 2000; // 2 seconds
int sum, amount;
FinalDTAdapter finalDTAdapter;
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void afterTextChanged(final Editable editable) {
timer.cancel();
timer = new Timer();
timer.schedule(
new TimerTask() {
@Override
public void run() {
if (editable.toString().length() > 0) {
amount = Integer.parseInt(editable.toString());
}
GenRecNew.addn.add(amount);
System.out.println("amount :" + amount);
for (int i = 0; i < GenRecNew.addn.size(); i++) {
sum += GenRecNew.addn.get(i);
}
String res = String.valueOf(sum);
GenRecNew.mFinalDonationAmount.setText(res);
}
},
DELAY
);
}}
此代码在用户停止输入后等待2秒钟,然后对其进行处理。