如何让TextWatcher在做一些操作之前等待一段时间

时间:2013-02-02 09:48:45

标签: android android-listview android-edittext textwatcher

我有一个EditText来过滤下方ListView中的项目,通常可能包含超过1000个项目。 TextWatcher是:

txt_itemSearch.addTextChangedListener(new TextWatcher() {

public void onTextChanged(CharSequence s, int start, int before, int count) {
    fillItemList();
}
public void afterTextChanged(Editable s) {
}

public void beforeTextChanged(CharSequence s, int start, int count,
                int after) {
}
});

这里的问题是,对于用户键入的每个字母,列表都会刷新,这是重复的列表更新,导致UI变慢。

如何使TextWatcher等待1-2秒,如果2秒后没有更多输入,则过滤列表。有什么建议吗?

2 个答案:

答案 0 :(得分:16)

  

如何让textWatcher等待1-2秒,如果没有更多输入   在2秒后发生,然后过滤列表。

正如我在评论中已经说过的那样,您应该考虑使用适配器的getFilter()方法。因为这可能不合适(如你所说)尝试实现相同的机制,适配器的过滤器用于在过滤器输入之间取消。

private Handler mHandler = new Handler();

public void afterTextChanged(Editable s) {
      mHandler.removeCallbacks(mFilterTask); 
      mHandler.postDelayed(mFilterTask, 2000);
}

其中filterTask是:

Runnable mFilterTask = new Runnable() {

     @Override
     public void run() {
          fillItemList();
     }       
}

答案 1 :(得分:0)

使用RxBinding

RxTextView.textChanges(edittext)
            .skipInitialValue()
            .debounce(TIME_TO_WAIT, TimeUnit.MILLISECONDS)
            .subscribe({
               //do the thing
            })
}