SearchView onQueryTextChange忽略以前的字符,仅使用最后输入的字符

时间:2018-01-04 04:04:18

标签: android searchview

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

例如,如果用户键入S Y M B O L,则每次输入字符时都会执行查询,因此执行6次查询。我想取消之前的5个查询,只运行最后一个查询。

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

我的表中有超过700,000个项目,因此屏幕需要几秒钟才能更新,我希望它能够立即更新。 如果用户键入速度慢,则表示没问题,但如果用户输入速度很快,则屏幕更新速度非常慢。

我正在使用RecyclerView并且查询返回LiveData。

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

有解决方法吗?

3 个答案:

答案 0 :(得分:1)

您可以使用每次用户输入时都会重置的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;
}

答案 1 :(得分:1)

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

希望有所帮助

答案 2 :(得分:1)

首先,您查询数据库的代码不应该在UI线程上,或者您可能会收到ANR消息,而且它不是一个好的用户体验,相反,您应该是向用户显示某种进度消息/对话框/视图。

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

如果您不想在代码库中添加其他依赖项,则可以使用Handler将帖子延迟作为其中一种解决方案。