apo*_*020 22 android android-edittext
当用户在EditText中键入时,我使用以下代码执行搜索:
EditText queryView = (EditText) findViewById(R.id.querybox);
queryView.addTextChangedListener(new TextWatcher() {
@Override
public void afterTextChanged(Editable s) {
triggerSearch(s.toString());
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
});
Run Code Online (Sandbox Code Playgroud)
但是,当用户键入单词时,这会多次触发.也就是说,如果用户输入"hello",则此代码将触发5次值("h","he","hel","hell","hello").通常情况下,这样会很好但是触发搜索很昂贵,而且我不想在没有太大用处的中间搜索上浪费资源.我想要的是在用户开始输入后仅触发某个阈值的侦听器,或者在调用之前在侦听器中等待的某种框架,triggerSearch如果在该等待之前触发了另一个事件,则取消自身.
apo*_*020 49
由于找不到合适的事件接口,尝试触发延迟搜索.代码实际上非常简单和强大.
private final int TRIGGER_SERACH = 1;
// Where did 1000 come from? It's arbitrary, since I can't find average android typing speed.
private final long SEARCH_TRIGGER_DELAY_IN_MS = 1000;
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
if (msg.what == TRIGGER_SERACH) {
triggerSearch();
}
}
};
queryView.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i2, int i3) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i2, int i3) {
}
@Override
public void afterTextChanged(Editable s) {
handler.removeMessages(TRIGGER_SERACH);
handler.sendEmptyMessageDelayed(TRIGGER_SERACH, SEARCH_TRIGGER_DELAY_IN_MS);
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6386 次 |
| 最近记录: |