android - 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());
}
});
}`
解决方案
如果您只想在用户按下回车/搜索键后加载结果,则无需添加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) { }
});
推荐阅读
- teamcity - TeamCity安装成功后找不到newman包
- python - 如何保持 XML 标签的顺序,甚至使用 python 添加/删除标签
- angular - 带引导的角度芯片,不依赖于材料
- c++ - 如何处理来自 MIPI 相机的 12 位图像?
- regex - 正则表达式查找由字符串包围的任何字符串
- machine-learning - 有什么方法可以在特殊条件下逼近softmax概率?
- google-sheets - 使用多个条件的 Vlookup [Vlookup & Hlookup 结合]
- python - 使用 pywinauto 处理任务栏图标的上下文菜单
- python-3.x - 在应用程序中添加新的 tkinter 模块以及从它们调用条目的能力
- javascript - 如何在 angularjs 服务中使用 $scope