android - 读取 ListView 的 EditText 的完成输入

标签 android arraylist android-edittext textwatcher

所以在我的一个应用程序 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 秒,然后进行处理。

关于android - 读取 ListView 的 EditText 的完成输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49146901/

相关文章:

java - 出现空指针异常

java - Android Java 读取和保存数据不起作用

java - 数组列表中的子类元素不会使用 Java 中的重写方法

Java,使用参数列表进行构造函数调用?

android - 编辑文本 : suppress soft keyboard but allow selection and cursor?

java - 从 Android 设备卸载应用程序时,从 SUP 服务器删除应用程序连接

android - 看不见的音频文件

java - 如何获取警报对话框中的列表?

Android 在点击 (+) 按钮时添加 edittext 字段并通过点击 (-) 删除

android - 更改 Edittext 的 inputType 后,Edittext 输入的数字无法正常工作