AutoCompleteTextView с SimpleCursorAdapter не фильтрует - PullRequest
0 голосов
/ 03 ноября 2019

В моем приложении есть несколько виджетов AutoCompleteTextView, которые используют ArrayAdapter.

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 для работы с этим представлением, которое мне не нужно было делать при использовании ArrayAdapter. Я искал этот сайт и читал Документы для разработчиков, и должно быть что-то, чего я просто не понимаю. Пожалуйста, просветите меня.

1 Ответ

0 голосов
/ 03 ноября 2019

Этот сайт позволил мне ответить на этот вопрос: 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;
        }
    });
}

Я хотел продублировать слово, начинающееся со значения по умолчаниюфункциональность AutoCompeteTextView с использованием курсора SQLite, только чтобы обнаружить, что REGEXP не полностью поддерживается. Так что эта тема StackOverflow дала мне как обходной путь. SQLite LIKE альтернатива для REGEXP, Match Start of Any Word

Надеюсь, это поможет другим.

...