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.
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); });
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With