【问题标题】:AutoCompleteTextView with SimpleCursorAdapter does not filter带有 SimpleCursorAdapter 的 AutoCompleteTextView 不过滤
【发布时间】:2019-11-03 15:42:28
【问题描述】:

在我的应用程序中,我有一些使用 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 时不需要这样做。我已经搜索了这个站点并阅读了开发人员文档,一定有一些我没有得到的东西。请赐教。

【问题讨论】:

    标签: android autocompletetextview simplecursoradapter


    【解决方案1】:

    这个网站让我回答了这个问题: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 alternative for REGEXP, Match Start of Any Word

    我希望这对其他人有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-13
      • 1970-01-01
      • 2021-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多