使用 SearchView 在 SearchView.OnQueryTextListener 中延迟调用 onQueryTextChange()

Delay call to onQueryTextChange() in SearchView.OnQueryTextListener with SearchView

在我的应用程序中使用 SearchView

我是否可以延迟调用 onQueryTextChange() 方法。比如,当用户键入一系列字符时,他必须等待此方法被调用。

此等待应该取决于键入的字符数,但在命中方法之前需要稍作停顿。

我想暂停一下,因为当用户在搜索视图中键入内容时,将向服务器发出带有字符串的请求以请求匹配的数据,然后我将根据建议填充我的 ListView。

Activity 信息(如果需要):
实现 SearchView.OnQueryTextListener.

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

要延迟对服务器的调用,请在 onQueryTextChange 方法中使用以下代码,变量 mQueryString 和 mHandler 必须是 class 变量。 还要检查 mHandler!=null

@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;
}

使用 SearchView

在 SearchView.OnQueryTextListener 中延迟调用 onQueryTextChange()
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);
            }
        });

这应该对您有所帮助,您的 class 需要实施 "SearchView.OnQueryTextListener" 并且 "cntr" 必须在您的 class

中声明

这已经为普通用户输入提供了 twinked,如果您想等待更多,只需提高 "waitingTime"。

请求应该在 "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;
}

您可以像这样使用 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
    }

1) 创建摘要 class:

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
    }
});