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

问题描述 投票:0回答:3

有没有办法忽略输入的所有先前字符,这些字符会被传递到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。

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

这有解决方案吗?

android searchview
3个回答
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 
                }
            }
    );

希望能帮助到你


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
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.