【问题标题】:Search starts when Edittext has at least 3 letters当 Edittext 至少有 3 个字母时开始搜索
【发布时间】:2019-01-16 14:52:58
【问题描述】:

我在一个 Android 工作室项目中工作。在这里,我想实现一个搜索系统。我有一个edittext 和一个imagebutton。当用户在edittext 中写入内容并按下imagebutton 时,系统会显示来自某个数据库的相关数据。我已经介绍了这么多。

此外,我想实现一个系统,当用户在edittext 中写入至少特定长度的字母(比如 3)时,搜索将自动开始。随着更多字母的添加,搜索将被相应地过滤。是否有可能做到这一点?或者类似的东西?

【问题讨论】:

  • 能否添加相关代码?
  • 你试过什么?你被困在哪里了?看看你的问题How to Ask

标签: android search android-edittext


【解决方案1】:

您必须将文本观察器添加到您的编辑文本中。我将向您展示使用 debounce 来避免在用户输入文本时更新列表的解决方案。 因此,让我们从将 textWatcher 添加到您的 edittext 字段开始:

searchField.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {

        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            //this one is for all letters, you can check the s length eg if(s.length() >= 3)
            searchSubject.onNext(s.toString());
        }

        @Override
        public void afterTextChanged(Editable s) {

        }
    });

如果您不想这样做,此解决方案使用 rxjava,只需将 searchSubject 替换为调用您的搜索方法。 所以字段:

private PublishSubject<String> searchSubject = PublishSubject.create();
private Subscription searchSubscription;
private String currentSearchPrefix = "";

和订阅(调用这个方法onResume):

/**
 * Subscribe to searchSubject to update list of items depends on given prefix.
 * Debounce on changes 500 milliseconds
 */
private void subscribeSearch() {
    searchSubscription = searchSubject
            .debounce(500, TimeUnit.MILLISECONDS)
            .onBackpressureLatest()
            .subscribe(result -> {
                currentSearchPrefix = result;
                MainActivity.this.runOnUiThread(this::refreshList);
            });
}

我的方法 refreshList 只是通过使用 currentSearchprefix 按字段之一过滤来更新列表。记得取消订阅 searchSubscription onPause()。

【讨论】:

    【解决方案2】:

    在 searchview 上有这种语法。只需检查文本的长度

        public void onQueryTextChange(String query) {
           if(query.length() >= 3) {
              searchStarts();
           }
        }
    

    或者如果您不使用搜索视图,请使用 textwatcher

    textWatcher = new TextWatcher() {
                @Override
                public void beforeTextChanged(CharSequence s, int start, int count, int after) {
    
                }
    
                @Override
                public void onTextChanged(CharSequence s, int start, int before, int count) {
                    if (timer != null) {
                        timer.cancel();
                    }
                }
    
                @Override
                public void afterTextChanged(Editable s) {
                    if(s.length() > 3){
                        searchStarts();
                }
            };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多