【问题标题】:SearchView onQueryTextChange ignore previous characters and only use last typed characterSearchView onQueryTextChange 忽略以前的字符,只使用最后输入的字符
【发布时间】:2018-01-04 04:04:17
【问题描述】:

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

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

有解决办法吗?

【问题讨论】:

  • 是的,您可以通过.debounce operator.this 链接使用RxSearch 来实现这一点。

标签: android searchview


【解决方案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】:

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-03
        • 1970-01-01
        相关资源
        最近更新 更多