Задержать вызов onQueryTextChange() в SearchView.OnQueryTextListener с помощью SearchView

Использование SearchView в моем приложении.

В любом случае, я могу сделать вызов метода onQueryTextChange() задержанным. Например, когда пользователь вводит последовательность символов, он должен ждать, пока этот метод не будет вызван.

Это ожидание должно не зависеть от количества введенных символов, но перед удалением метода требуется небольшая пауза.

Я хочу приостановить, потому что, поскольку пользователь вводит в представление поиска, запрос с строкой будет сделан на сервер для запроса согласованных данных, а затем я буду заполнять свой ListView в соответствии с предложениями.

Информация о деятельности (если требуется):
Реализует SearchView.OnQueryTextListener.

    MenuItem searchItem = menu.findItem(R.id.action_search);
    SearchView searchView = (SearchView)MenuItemCompat.getActionView(searchItem);
    searchView.setOnQueryTextListener(this);

Ответ 1

Чтобы отложить вызов на ваш сервер, используйте следующий код в вашем методе onQueryTextChange, переменные mQueryString и mHandler должны быть переменными класса. также проверьте mHandler! = ноль

@Override
public boolean onQueryTextChange(String searchTerm) {
    mQueryString = searchTerm;
    mHandler.removeCallbacksAndMessages(null);

    mHandler.postDelayed(new Runnable() {
        @Override
        public void run() {
           //Put your call to the server here (with mQueryString)
        }
    }, 300);
    return true;
}

Ответ 2

Это должно помочь вам, вашему классу необходимо реализовать "SearchView.OnQueryTextListener" и "cntr" должны быть объявлены в вашем классе

Это уже twinked для обычного ввода пользователем, если вы хотите подождать больше, просто поднимите "waitTime".

Запрос должен быть внутри "onFinish"

    private int waitingTime = 200;
    private CountDownTimer cntr;

    @Override
    public boolean onQueryTextChange(String newText) {
    if(cntr != null){
        cntr.cancel();
    }
    cntr = new CountDownTimer(waitingTime, 500) {

        public void onTick(long millisUntilFinished) {
            Log.d("TIME","seconds remaining: " + millisUntilFinished / 1000);
        }

        public void onFinish() {
            Log.d("FINISHED","DONE");
        }
    };
    cntr.start();
    return false;
}

Ответ 3

Задержать вызов onQueryTextChange() в SearchView.OnQueryTextListener с SearchView

private long delay = 2000; 
private long editTextLastWord = 0;
privaste  SearchView searchView;
Handler handler = new Handler();

private Runnable runnable = new Runnable() {
    public void run() {
        if (System.currentTimeMillis() > (editTextLastWord + delay - 500)) {

          perFormTask();
        }
    }
};
 searchView=(SearchView) findViewById(R.id.searchView);
        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {
                return false;
 if (s.length() > 2) {              
          editTextLastWord = System.currentTimeMillis();
          handler.postDelayed(runnable, delay);
        } else {

        }
            }

            @Override
            public boolean onQueryTextChange(String newText) {
                return false;
  handler.removeCallbacks(runnable);
            }
        });

Ответ 4

Вы можете использовать сопрограммы Kotlin, как это. Объявить обратный отсчет

private lateinit var textChangeCountDownJob: Job

И затем onQueryTextChange:

    override fun onQueryTextChange(newText: String): Boolean {

        if(::textChangeCountDownJob.isInitialized)
            textChangeCountDownJob.cancel()

        textChangeCountDownJob = launch(UI) {
            delay(800)
        }

        return false
    }

Ответ 5

1) Создайте абстрактный класс:

public abstract class DelayedOnQueryTextListener implements SearchView.OnQueryTextListener {

    private Handler handler = new Handler();
    private Runnable runnable;

    @Override
    public boolean onQueryTextSubmit(String s) {
        return false;
    }

    @Override
    public boolean onQueryTextChange(String s) {
        handler.removeCallbacks(runnable);
        runnable = () -> onDelayerQueryTextChange(s);
        handler.postDelayed(runnable, 400);
        return true;
    }

    public abstract void onDelayerQueryTextChange(String query);
}

2) Установите это так:

searchView.setOnQueryTextListener(new DelayedOnQueryTextListener() {
    @Override
    public void onDelayerQueryTextChange(String query) {
        // Handle query
    }
});