android - 带有 SimpleCursorAdapter 的 AutoCompleteTextView 不过滤
问题描述
在我的应用程序中,我有一些使用 ArrayAdapter 的 AutoCompleteTextView 小部件。
private List<String> adapterList = new ArrayList<String>();
ArrayAdapter<String> dropdownAdapter;
dropdownAdapter = new ArrayAdapter<>(getContext(), R.layout.simple_dropdown_item, adapterList);
autoCompleteTextView.setAdapter(dropdownAdapter);
它工作得很好。当我在视图中输入内容时,我会在下拉列表中看到以单词开头的结果。
我想使用另一个 AutoCompleteTextView 来执行此操作,但这次使用的是 SimpleCursorAdapter。
nameSearchCursor = dbHelper.getChecklistTabDataByChecklistId(outingId, checklistId, nameColumn);
NameSearch = root.findViewById(R.id.SearchNames);
String[] nsColumns = new String[]{nameColumn};
int[] nsTo = new int[]{R.id.simpleDropdownItem};
nameSearchCursorAdapter = new SimpleCursorAdapter(getContext(), R.layout.simple_dropdown_item,
nameSearchCursor, nsColumns, nsTo, 0);
NameSearch.setAdapter(nameSearchCursorAdapter);
如果我开始在这个新视图中输入,下拉列表会出现并显示整个列表,并且在我输入时没有任何变化。不发生过滤。我需要做些什么不同的事情(也许是为什么)才能让 CursorAdapter 与这个 View 一起工作,而我在使用 ArrayAdapter 时不需要这样做。我已经搜索了这个站点并阅读了开发人员文档,一定有一些我没有得到的东西。请赐教。
解决方案
这个网站允许我回答这个问题:http ://www.outofwhatbox.com/blog/2010/11/android-simpler-autocompletetextview-with-simplecursoradapter/
这是我完成的代码:
private void setUpNameSearch() {
// Get AutoCompleteTextView
nameSearchView = root.findViewById(R.id.SearchNames);
// Define from/to info
final String[] nsColumns = new String[]{nameColumn};
final int[] nsTo = new int[]{R.id.simpleDropdownItem};
// Create adapter. Cursor set in setFilterQueryProvider() below.
nameSearchCursorAdapter = new SimpleCursorAdapter(getContext(), R.layout.simple_dropdown_item,
null, nsColumns, nsTo, 0);
// Set adapter on view.
nameSearchView.setAdapter(nameSearchCursorAdapter);
// OnItemClickListener - User selected value from DropDown
nameSearchView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> listView, View view, int position, long id) {
// Get the cursor. Positioned to the corresponding row in the result set.
Cursor cursor = (Cursor) listView.getItemAtPosition(position);
// Get the name selected
String selectedName = cursor.getString(cursor.getColumnIndexOrThrow(nameColumn));
// Do something with this value...
}
});
// Set the CursorToStringconverter, to provide the values for the choices to be displayed
// in the AutoCompleteTextview.
nameSearchCursorAdapter.setCursorToStringConverter(new SimpleCursorAdapter.CursorToStringConverter() {
@Override
public CharSequence convertToString(Cursor cursor) {
final String name = cursor.getString(cursor.getColumnIndexOrThrow(nameColumn));
return name;
}
});
// Set the FilterQueryProvider, to run queries for choices
nameSearchCursorAdapter.setFilterQueryProvider(new FilterQueryProvider() {
@Override
public Cursor runQuery(CharSequence constraint) {
Cursor cursor = dbHelper.getMatchingNames(outingId, checklistId, nameColumn,
(constraint != null ? constraint.toString() : null));
return cursor;
}
});
}
我想使用 SQLite 光标复制 AutoCompeteTextView 的默认单词开头功能,结果发现不完全支持 REGEXP。所以这个 StackOverflow 主题给了我 LIKE 解决方法。SQLite LIKE 替代 REGEXP,匹配任何单词的开头
我希望这对其他人有帮助。
推荐阅读
- javascript - Greasemonkey (Violentmonkey) 脚本更改网站值
- mysql - mysql jsonarrayagg 用于逗号分隔的 id
- bash - 根据蛋白质片段将单个 fasta 文件分成多个 fasta 文件
- python - 硒不加载
- 里面
- 里面
- 里面
- laravel - Laravel Scout/Meilisearch - 按不可搜索的列过滤
- excel - 如果满足条件,则 VBA 代码复制粘贴多个单元格
- c# - 返回响应并开始处理繁重的工作
- javascript - 我有一个关于如何迭代 innerHTML 表中的所有数据的问题
- javascript - 如何使用 react-select 修复 Select 输入中的 Onchange 方法?
- ios - 如何解码对象中数组中的嵌套 JSON 对象?