当Edittext至少包含3个字母时,搜索开始

时间:2018-08-09 08:13:07

标签: android search android-edittext

我正在一个Android Studio项目中工作。在这里,我想实现一个搜索系统。我有一个edittext和一个imagebutton。当用户在edittext中编写内容并按imagebutton时,系统将显示某个数据库中的相关数据。我已经讲完了。

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

2 个答案:

答案 0 :(得分:0)

在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();
            }
        };

答案 1 :(得分:0)

您必须将文本监视程序添加到您的编辑文本中。我将向您展示使用反跳避免在用户键入文本时始终更新列表的解决方案。 因此,让我们开始将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()。