androidfilterandroid-edittexttextwatchertextchanged

How can I do something 0.5 seconds after text changed in my EditText control?


I am filtering my list using an EditText control. I want to filter the list 0.5 seconds after the user has finished typing in EditText. I used the afterTextChanged event of TextWatcher for this purpose. But this event rises for each character changes in EditText.

What should I do?


Solution

  • Use:

    editText.addTextChangedListener(
        new TextWatcher() {
            @Override public void onTextChanged(CharSequence s, int start, int before, int count) { }
            @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { }
    
            private Timer timer = new Timer();
            private final long DELAY = 1000; // Milliseconds
    
            @Override
            public void afterTextChanged(final Editable s) {
                timer.cancel();
                timer = new Timer();
                timer.schedule(
                    new TimerTask() {
                        @Override
                        public void run() {
                            // TODO: Do what you need here (refresh list).
                            // You will probably need to use
                            // runOnUiThread(Runnable action) for some
                            // specific actions (e.g., manipulating views).
                        }
                    },
                    DELAY
                );
            }
        }
    );
    

    The trick is in canceling and rescheduling Timer each time, when text in EditText gets changed.

    For how long to set the delay, see this post.