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