SearchView onQueryTextChange 忽略前面的字符,只使用最后输入的字符

SearchView onQueryTextChange ignore previous characters and only use last typed character

有没有办法忽略之前输入的所有字符,这些字符会传递给 onQueryTextChange 直到输入最后一个字符?

比如用户输入S Y M B O L,每输入一个字符就执行一次查询,所以执行6次查询。我想取消前5次查询,只取消运行最后一次

"select * from table where name  LIKE  :searchText || '%' order by name  limit 500"

我的 table 里面有超过 700,000 个项目,所以屏幕更新大约需要几秒钟,我希望它能立即更新。 如果用户打字慢,没关系,但如果他们打字快,屏幕更新就会很慢。

我正在使用 RecyclerView 并查询 returns LiveData。

我在这个特定的列上有一个索引,所以这不是问题。

有解决办法吗?

您可以使用 timer,每次用户键入时都会重置:

(比方说,如果用户打字,5秒内没有新文本会触发搜索,如果太长可以调整秒数)

CountDownTimer timer = new CountDownTimer(5000, 1000) { //5000 for 5 seconds
    public void onTick(long millisUntilFinished) {
    }

    public void onFinish() {
        //do your searching here
    }
};

在你的 onQueryTextChange 上:

@Override
public boolean onQueryTextChange(String newText) {
   timer.cancel();
   timer.start();

   return false;
}

您可以使用 onQueryTextSubmit() 回调来传递最终键入的字符串

searchView.setOnQueryTextListener(
            new SearchView.OnQueryTextListener() {

                @Override
                public boolean onQueryTextSubmit(String query) {
                    Intent intent = new Intent(context, SearchResultActivity.class);
                    intent.putExtra(QUERY, query);// Perform search task with query string 
                    context.startActivity(intent);
                    return false;
                }

                @Override
                public boolean onQueryTextChange(String newText) {
                    return false;// triggered every time you type a character 
                }
            }
    );

希望对您有所帮助

首先,你查询数据库的代码不应该在 UI 线程上,否则你可能会收到一条 ANR 消息,这不是一个好的 UX,相反你应该向用户显示某种进步 message/dialog/view.

有几种不同的方法可以执行此任务,可以通过 Jake Wharton 的库非常轻松地完成 RxBinding 您只需添加 .debounce(some_number_of_time_units, Unit.specified_time_unit)

如果您不想向您的代码库添加其他依赖项,您可以使用 Handler 和 post 延迟作为解决方案之一。