10

我有一个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 秒后没有更多输入发生,则过滤列表。有什么建议吗?

4

2 回答 2

17

如何让 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();
     }       
}
于 2013-02-02T10:34:03.227 回答
0

使用RxBinding

RxTextView.textChanges(edittext)
            .skipInitialValue()
            .debounce(TIME_TO_WAIT, TimeUnit.MILLISECONDS)
            .subscribe({
               //do the thing
            })
}
于 2018-02-05T07:24:20.227 回答