Автозаполнение текстового представления + JSON сервер для динамического получения тегов
Я разрабатываю приложение для android. У меня есть autocompleteTextView в моем макете. Я хочу заполнить этот textView предложениями с моего сервера. На сервере около 400 ключевых слов, и они будут увеличиваться в ближайшем будущем, поэтому я не могу разобрать все теги сразу, а затем проверить предложения. AutocompleteTextView должен работать больше как поиск google, так что я разбираю только тогда, когда пользователь ввел что-то, и этот разбор происходит в потоке пользовательского интерфейса.
Но я я здесь не в состоянии вызвать этот парсер, так как я не в состоянии получить этот метод обратного вызова или может быть событие, которое чувствует, что пользователь ввел что-то или может быть отредактирован какой-то текст.
SetOnEditorActionListener работает только тогда, когда пользователь нажимает кнопку enter на программной клавиатуре.
Заранее спасибо
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()
. Надеюсь, это поможет!