首页 > 解决方案 > EditText - 如何检测输入 3 个或更多字符并执行搜索

问题描述

需要帮忙。已经4天没有任何反应。尝试进行 SQLite 数据库搜索。如何使列表视图不立即显示,而仅在用户输入搜索查询时显示?也就是说,数据库中的数据没有被过滤,但是当用户输入请求时,匹配项出现在列表视图中。非常感谢大家提前!

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.test);

    userFilter = findViewById(R.id.userFilter);
    listView = findViewById(R.id.listView);

    final DatabaseAccessSmeta databaseAccessSmeta = DatabaseAccessSmeta.getInstance(this);
    databaseAccessSmeta.open();
    List<String> quotes = databaseAccessSmeta.Search();
    databaseAccessSmeta.close();


    final ArrayAdapter<String> adapter = new ArrayAdapter<>(this, R.layout.region_list, quotes);
    this.listView.setAdapter(adapter);

    adapter.getFilter().filter(userFilter.getText().toString());

    userFilter.addTextChangedListener(new TextWatcher() {

        public void afterTextChanged(Editable s) { }

        public void beforeTextChanged(CharSequence s, int start, int count, int after) { }
        
        public void onTextChanged(CharSequence s, int start, int before, int count) {

            adapter.getFilter().filter(s.toString());
        }
    });


}` 

标签: androiddatabasesqlitesearch

解决方案


如果您只想在用户按下回车/搜索键后加载结果,则无需添加TextWatcher,只需添加 EditorActionListener:

/* Adding action listener for handling search click */
userFilter.setOnEditorActionListener((v, actionId, event) -> {
    if (actionId == EditorInfo.IME_ACTION_SEARCH) {
        // Hiding keyboard
        userFilter.clearFocus();
        InputMethodManager in = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        if (in != null) {
            in.hideSoftInputFromWindow(userFilter.getWindowToken(), 0);
        }
        // Initiate search
        adapter.getFilter().filter(userFilter.getText().toString());
        return true;
    }
    return false;
});

同样在您的 xml 中,添加android:imeOptions="actionSearch"到您的EditText.

编辑:

如果您希望它在输入 3 个字符后可见,则必须添加TextWatcher

userFilter.addTextChangedListener(new TextWatcher() {
    public void afterTextChanged(Editable s) {
        String query = (s != null) ? s.toString() : "";
        if (query.length() >= 3) {
            listView.setVisibility(View.VISIBLE);
            adapter.getFilter().filter(query);
        } else {
            // Either set an empty list or change visibility
            listView.setVisibility(View.INVISIBLE);
            adapter.getFilter().filter("");
        }
    }
    public void beforeTextChanged(CharSequence s, int start, int count, int after) { }
    public void onTextChanged(CharSequence s, int start, int before, int count) { }
});

推荐阅读