I use the following code to perform search when user types in an 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) {
}
});
However, this triggers multiple times when the user is typing a word. That is if the user is typing "hello", this code will trigger 5 times with values ("h", "he" , "hel", "hell", "hello"). Normally, this would be fine but the triggered search is expensive and I don't want to waste resources on intermediate searches that are of no great use. What I want is either a listener that triggers only a certain threshold after the user starts typing, or some kind of framework, that waits in the listener before calling triggerSearch
, and if another event is triggered before that wait, cancels itself.
Since couldn't find an appropriate event interface, tried triggering a delayed search. The code is actually pretty simple and robust.
One solution would be to not execute your triggered search immediately but after some interval, say 100ms, has passed since the
onTextChanged
method gets called. Additionally reset this interval each time text is typed.This way the triggered search doesn't get called while the user is typing.
To wait in the listener before calling
triggerSearch
; test the length ofEditable s
.if(s.length() > THRESHOLD)
If you don't want to trigger the search on every button pressed, then you need to know when the user is done. I would avoid complex ideas of attempting to figure out when the user is done typing. It will lead to the user being confused as to when the search occurs.
Simple answer then is put a "done" button and apply an onClickListener on the button and execute your search there.
Easiest code: in xml
in java: