【问题标题】:Textwatcher on Edittext with a Listview is working slow带有 Listview 的 Edittext 上的 Textwatcher 工作缓慢
【发布时间】:2017-07-14 12:53:04
【问题描述】:

我正在开发一个单位转换器应用程序。它从 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) {

            }
        });

【问题讨论】:

  • 我的建议是使用Handler Runnable。将所有逻辑移至另一个方法,并像this 一样实现它。好的做法是等到用户完成输入。

标签: java android listview textwatcher


【解决方案1】:

我认为这很慢,因为您在 TextWatcheronTextChanged 方法中做了大量工作。

您可以为用户输入设置一个垃圾等待时间(例如 1 秒),在用户完成输入后您就可以开始工作了。

有几种方法可以处理这个问题。

首先,您可以创建一个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 Debounce 运算符来处理此问题。

    // First create your observable
    Observable<OnTextChangeEvent> yourTextChangeObservable = WidgetObservable.text(yourInputText);

    // And create your subscription
    yourTextChangeSubscription = yourTextChangeObservable
      .debounce(YORU_TRASH_HOLD_TIME, TimeUnit.MILLISECONDS)
      .map(OnTextChangeEvent::text)
      .map(CharSequence::toString)
      .observeOn(AndroidSchedulers.mainThread())
      .subscribe(s -> {
                // do your work here with your input
            }
        );

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

【讨论】:

    猜你喜欢
    • 2019-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-15
    • 1970-01-01
    • 2016-12-11
    • 2015-02-28
    • 1970-01-01
    相关资源
    最近更新 更多