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

Shu*_* A. 15 android searchview

SearchView在我的应用程序中使用a .

无论如何,我可以延迟调用onQueryTextChange()方法.就像,当用户键入一系列字符时,他必须等到调用此方法之前.

这种等待应该依赖于输入的字符数,但还没有一个小停顿正在热播方法之前需要.

我想暂停,因为当用户键入搜索视图时,带有字符串的请求将被发送到服务器以请求匹配的数据,然后我将根据建议填充我的ListView.

活动信息(如果需要):
实施SearchView.OnQueryTextListener.

    MenuItem searchItem = menu.findItem(R.id.action_search);
    SearchView searchView = (SearchView)MenuItemCompat.getActionView(searchItem);
    searchView.setOnQueryTextListener(this);
Run Code Online (Sandbox Code Playgroud)

小智 30

要延迟对服务器的调用,请在onQueryTextChange方法中使用以下代码,变量mQueryString和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;
}
Run Code Online (Sandbox Code Playgroud)


C. *_*ann 7

这应该对你有帮助,你的类需要实现"SearchView.OnQueryTextListener",并且必须在你的类中声明"cntr"

对于常规用户输入,这已经是闪烁的,如果你想等待更多,只需提高"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;
}
Run Code Online (Sandbox Code Playgroud)


Suk*_*iya 7

您可以像这样使用 Kotlin 协程。宣布倒计时工作

private lateinit var textChangeCountDownJob: Job
Run Code Online (Sandbox Code Playgroud)

然后 onQueryTextChange:

    override fun onQueryTextChange(newText: String): Boolean {

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

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

        return false
    }
Run Code Online (Sandbox Code Playgroud)