Это звучит просто, но мне было тяжело. У меня есть текст автозаполнения, который показывает адрес местоположения пользователя. Я также реализовал места api для получения адресов, если пользователь входит в другое место, отличное от своего местоположения. Все работает так, как предполагается, но результат в местах все еще показывается, даже когда уже есть адрес. Чтобы снизить затраты, я хотел бы получить результаты адреса только тогда, когда пользователь вводит адрес. Я сделал глобальное логическое значение и установить его верно, когда текст изменяется следующим образом:Как получить результаты автозаполнения, только когда пользователь вводит текст
autocomplete.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
isTextEntered = true; //to get autocomplete get results only after user enters text
}
@Override
public void afterTextChanged(Editable s) {
}
});
Затем я проверяю, если логическое значение истинно, когда я установил свой адаптер, как например:
if (isTextEntered) {
autocomplete.setAdapter(new GooglePlacesAutocompleteAdapter(this, R.layout.search_results_list_item, R.id.tvSearchResultItem));
autocomplete.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
final String selectedPlace = (String) parent.getItemAtPosition(position);
autocomplete.setText(selectedPlace);
}
});
}
Но делать это в методе oncreate моей активности просто блокирует автозаполнение, показывая какие-либо результаты подсказок. Как я могу выполнить свою цель здесь? Как всегда, любая помощь очень ценится.
Это мой пользовательский класс адаптера:
class GooglePlacesAutocompleteAdapter extends ArrayAdapter implements Filterable {
private ArrayList resultList;
//private ArrayList<HashMap<String, Place>> results = new ArrayList<>();
public GooglePlacesAutocompleteAdapter(Context context, int list, int textViewResourceId) {
super(context, list, textViewResourceId);
}
@Override
public int getCount() {
return resultList.size();
}
@Override
public String getItem(int index) {
return resultList.get(index).toString();
}
//@Override
//public HashMap<String, Place> getItem(int index) {return results.get(index);}
@Override
public Filter getFilter() {
Filter filter = new Filter() {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults filterResults = new FilterResults();
if (constraint != null) {
// Retrieve the autocomplete results.
resultList = autocomplete(constraint.toString());
// Assign the data to the FilterResults
filterResults.values = resultList;
filterResults.count = resultList.size();
}
return filterResults;
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
if (results != null && results.count > 0) {
notifyDataSetChanged();
} else {
notifyDataSetInvalidated();
}
}
};
return filter;
}
}
Нет необходимости в 'TextWatcher' и' OnItemClickListener', это делается 'AutoCo mpleteTextView', все, что вам нужно, это предоставить отфильтрованные данные в адаптер. – pskink
@pskink Я реализую интерфейсы TextWatcher и OnItemClickListener класса AutocompleteTextView. Я не понимаю, что вы имеете в виду. –
см. Мой ответ [здесь] (http://stackoverflow.com/a/19860624/2252830) – pskink