读取 ListView 的 EditText 的完成输入
Reading finished input of a ListView's EditText
所以在我的一个应用程序 activity 中,我有一个 listView,它由一个 EditText 组成,用户输入一个金额,我想在其中一个 textView 中显示总金额。我尝试的方法是像这样将 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 中,然后计算数组所有元素的总和。问题是当我输入金额示例时:数组中的 500 依次推送 5、50、500,并且总金额计算错误。你们能帮我推入数组的最终金额吗?我知道 onFocusChangeListner 有帮助,但请告诉我如何,无法弄清楚。提前致谢。
这里的问题是 TextWatcher
立即处理数据。您需要做的是对操作进行去抖动,以便仅在完成一定的延迟后才进行计算。您可以使用 Timer 来实现此目的(或者如果您在应用程序中使用 Rx,则使用 RxTextView 的去抖动操作)。以下是在原版 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 秒,然后进行处理。
所以在我的一个应用程序 activity 中,我有一个 listView,它由一个 EditText 组成,用户输入一个金额,我想在其中一个 textView 中显示总金额。我尝试的方法是像这样将 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 中,然后计算数组所有元素的总和。问题是当我输入金额示例时:数组中的 500 依次推送 5、50、500,并且总金额计算错误。你们能帮我推入数组的最终金额吗?我知道 onFocusChangeListner 有帮助,但请告诉我如何,无法弄清楚。提前致谢。
这里的问题是 TextWatcher
立即处理数据。您需要做的是对操作进行去抖动,以便仅在完成一定的延迟后才进行计算。您可以使用 Timer 来实现此目的(或者如果您在应用程序中使用 Rx,则使用 RxTextView 的去抖动操作)。以下是在原版 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 秒,然后进行处理。