У меня недавно была похожая потребность, и именно это я и сделал для достижения желаемого результата
// create a class-scope variable to track the most recent query
private String lastQuery;
private GeoDataClient geoDataClient;
// wrap the geoDataClient.getAutocompletePredictions in a class to associate the prediction results with the query that triggered the call
class AutocompletePredictor {
String query;
AutocompletePredictor(String query) {
this.query = query;
}
Task<AutocompletePredictionBufferResponse> getPredictions(LatLngBounds bounds, AutocompleteFilter typeFilter) {
return geoDataClient.getAutocompletePredictions(query, bounds, typeFilter);
}
}
// modify your method that triggers the autocomplete filter
void filterAutocomplete(String constraint) {
// update lastQuery every time this method is called
lastQuery = constraint;
// Submit the query to the autocomplete API and retrieve a PendingResult that will contain the results when the query completes.
final AutocompletePredictor predictor = new AutocompletePredictor(constraint);
Task<AutocompletePredictionBufferResponse> results = predictor.getPredictions(bounds, typeFilter);
results.addOnSuccessListener(autocompletePredictions -> {
// checks if the query for this filter is same as the most recent query issued to this method
if (autoCompletePredictionsListener != null && predictor.query.equals(lastQuery)) {
autoCompletePredictionsListener.onAutoCompleteSuccess(autocompletePredictions);
}
autocompletePredictions.release();
});
}
Редактировать: Задержка звонков, когда пользователь печатает ...
Вместовызывая метод автозаполнения каждый раз, когда изменяется содержимое EditText (что может происходить каждый раз, когда пользователь вводит символ), запланируйте вызов автозаполнения для ожидания в течение некоторого периода времени, прежде чем он будет фактически выполнен.Если содержимое EditText снова изменится до истечения периода ожидания, отмените предыдущее расписание и измените расписание.
editText.addTextChangedListener(new TextWatcher() {
int delayMilliseconds = 500;
Handler handler = new Handler();
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {}
@Override
public void afterTextChanged(Editable editable) {
final String constraint = editable.toString();
// remove all delayed/pending tasks set in the last 500 milliseconds
handler.removeCallbacksAndMessages(null);
// setup a new delayed task to execute after 500 milliseconds
handler.postDelayed(new Runnable() {
@Override
public void run() {
filterAutocomplete(constraint);
}
}, delayMilliseconds);
}
});