带有Listview的Edittext上的Textwatcher运行缓慢

时间:2017-07-14 12:53:04

标签: java android listview textwatcher

我正在开发一个单位转换器应用程序。它从EditText获取值,并将其与字符串数组中的值相乘,并再次存储在另一个数组中。然后在ListView中显示它。但EditText textwatcher工作缓慢。为什么呢?

etarea.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                if (etarea.getText().length() > 0){
                    double b = Double.parseDouble(etarea.getText().toString());
                    for(int i = 0; i <= valueSpinner.length -1; i++){
                        double a = Double.parseDouble(valueSpinner[i].toString());
                        double c = b*a;
                        DecimalFormat df = new DecimalFormat(decimal);
                        valueet[i] = df.format(c);
                    }
                    viewHolder.tvvalue.setText(valueet[i]);
                    tvareavalue.setText(valueet[posonclick]);
                }else{
                    viewHolder.tvvalue.setText("Enter Value");
                }
            }

            @Override
            public void afterTextChanged(Editable s) {

            }
        });

1 个答案:

答案 0 :(得分:0)

我觉得它很慢,因为你在[{1}}的{​​{1}}方法中做了大量工作。

您可以为用户输入设置垃圾保留时间(例如1秒),在用户完成输入后,您可以完成工作。

有几种方法可以解决这个问题。

首先,您可以创建onTextChanged并收听用户输入。在您的垃圾收集时间之后,您可以做您想做的事。

TextWatcher

创建一个可以完成工作的runnable。

Handler

并将其发布在// Create a handler. private Handler handler = new Handler(); final Runnable runnable = new Runnable() { @Override public void run() { if (etarea.getText().length() > 0){ double b = Double.parseDouble(etarea.getText().toString()); for(int i = 0; i <= valueSpinner.length -1; i++){ double a = Double.parseDouble(valueSpinner[i].toString()); double c = b*a; DecimalFormat df = new DecimalFormat(decimal); valueet[i] = df.format(c); } viewHolder.tvvalue.setText(valueet[i]); tvareavalue.setText(valueet[posonclick]); }else{ viewHolder.tvvalue.setText("Enter Value"); } } } 方法中。

TextWatcher's

对于第二种方式,您可以使用afterTextChanged public void afterTextChanged(Editable s) { handler.removeCallbacks(runnable); handler.postDelayed(runnable, YOUR_TRASH_HOLD_TIME); } 运算符来处理此问题。

RxJava

您可以从here获取有关Debounce运算符的更多信息。