Автозаполнение текстового представления + JSON сервер для динамического получения тегов


Я разрабатываю приложение для android. У меня есть autocompleteTextView в моем макете. Я хочу заполнить этот textView предложениями с моего сервера. На сервере около 400 ключевых слов, и они будут увеличиваться в ближайшем будущем, поэтому я не могу разобрать все теги сразу, а затем проверить предложения. AutocompleteTextView должен работать больше как поиск google, так что я разбираю только тогда, когда пользователь ввел что-то, и этот разбор происходит в потоке пользовательского интерфейса.

Но я я здесь не в состоянии вызвать этот парсер, так как я не в состоянии получить этот метод обратного вызова или может быть событие, которое чувствует, что пользователь ввел что-то или может быть отредактирован какой-то текст.

SetOnEditorActionListener работает только тогда, когда пользователь нажимает кнопку enter на программной клавиатуре.

Заранее спасибо

2 2

2 ответа:

Для реализации этого также можно использовать интерфейс Filter. Получается фильтр.performFiltering() вызывается из потока пользовательского интерфейса только для этого типа целей. Вот некоторый код, который я использую для этого:

        Filter filter = new Filter() {

        @Override
        public CharSequence convertResultToString(Object resultValue) {
            return resultValue.toString();
        }

        @Override
        protected FilterResults performFiltering(CharSequence charSequence) {
            if( charSequence == null ) return null;
            try {
                // This call hits the server with the name I'm looking for and parses the JSON returned for the first 25 results
                PagedResult results = searchByName( charSequence.toString(), 1, 25, true);
                FilterResults filterResults = new FilterResults();
                filterResults.values = results.getResults();
                filterResults.count = results.getResults().size();
                return filterResults;
            } catch (JSONException e) {
                return new FilterResults();
            }
        }

        @Override
        protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
            if( filterResults != null ) {
                adapter.clear();
                adapter.addAll( (List<MyObject>)filterResults.values );
            }
        }
    };

Затем с помощью фильтра:

    private AutoCompleteTextView beverageName;
    ...

    beverageName = findViewById( R.id.beverageName );
    ListAdapter adapter = ...
    adapter.setFilter(filter);
    beverageName.setAdapter(adapter);

Вы можете использовать интерфейсTextWatcher , чтобы делать что-то, когда пользователь изменяет текст в представлении EditText. Просто реализуйте один или несколько методов TextWatcher, я обычно использую onTextChanged(). Надеюсь, это поможет!