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

问题描述 投票:14回答:5

在我的应用程序中使用SearchView

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

此等待不应取决于已键入的字符数,但在方法被命中之前需要暂停一小段时间。

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

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

    MenuItem searchItem = menu.findItem(R.id.action_search);
    SearchView searchView = (SearchView)MenuItemCompat.getActionView(searchItem);
    searchView.setOnQueryTextListener(this);
android searchview
5个回答
29
投票

要延迟对服务器的调用,请在onQueryTextChange方法中使用以下代码,变量mQueryString和mHandler必须是类变量。还检查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;
}

6
投票

这应该对你有帮助,你的类需要实现“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;
}

1
投票

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

0
投票

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

0
投票

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
    }
});
© www.soinside.com 2019 - 2024. All rights reserved.