Цели:AutoCompleteTextView не предлагает для только первого поиска
Я хочу, чтобы получить некоторые строки из веба-сервиса и заполнить AutoCompleteTextView с them.This просто, но то, что я хочу на самом деле, чтобы начать поиск (вызвать вебсервис) при наборе текста.
Я имею в виду, например, что-то я набираю и через 3 секунды после ввода завершено заполняется AutoCompleteTextView и появляются подсказки.
То, что я сделал до сих пор:
Как вы можете видеть в приведенном ниже коде, я использовал CountDownTimer для достижения этой цели. Я установил его на 3 секунды и запустил его в OnTextChanged. Когда пользователь вводит тип, я очищаю CountDownTimer и создаю новый экземпляр и запускаю его снова.
Таким образом, всякий раз, когда пользователь вводит данные - на каждом нажатии клавиши - я сбрасываю счетчик.
После этого я вызываю свой метод - который вызывает веб-сервис и заполняет AutoCompleteTextView - в OnFinish() CountDownTimer.
Проблема:
Когда я заканчиваю печатать, все работает, как ожидалось, я могу видеть в режиме отладки. Но предложения не появляются ТОЛЬКО ПОСЛЕДНИЙ ПОИСК.
Я имею в виду, он работает, но AutoCompleteTextView не заполняется данными только в ПЕРВЫЙ РАЗ.
Примечание:
Я призываю WebService как синхронный и асинхронный путь.
counter=new MyCount(3000, 1000);
autoComplete.addTextChangedListener(new TextWatcher(){
public void afterTextChanged(Editable editable) {
if(isBackPressed){ //catch from KeyListener, if backspace is pressed don't invoke web service
isBackPressed=false;
return;
}
String newText = editable.toString();
searchText=newText;
}
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
public void onTextChanged(CharSequence s, int start, int before, int count) {
if(isBackPressed){
isBackPressed=false;
return;
}
counter.cancel();
counter=new MyCount(3000, 1000);
counter.start();
}
});
Вот мой CountDownTimer Класс
public class MyCount extends CountDownTimer{
public MyCount(long millisInFuture, long countDownInterval) {
super(millisInFuture, countDownInterval);
}
@Override
public void onFinish() {
invoke_webservice(searchText);
}
@Override
public void onTick(long millisUntilFinished) {
}
}
Вот мой метод для вызова веб-сервиса в синхронном образом
public void invoke_webservice(String key){
try{
. //code to invoke webservice and populate string [] results
.
.
aAdapter = new ArrayAdapter<String>(getApplicationContext(),R.layout.item,results);
autoComplete.setAdapter(aAdapter);
aAdapter.notifyDataSetChanged();
}
Вот мой метод для вызова веб-сервиса в асинхронном способом
class getJson extends AsyncTask<String,String,String>{
@Override
protected String doInBackground(String... key) {
String newText = key[0];
. //code to invoke webservice and populate string [] results
.
.
runOnUiThread(new Runnable(){
public void run(){
aAdapter = new ArrayAdapter<String>(getApplicationContext(),R.layout.item,results);
autoComplete.setAdapter(aAdapter);
aAdapter.notifyDataSetChanged();
}
});
return null;
}
}
Заранее спасибо
Пожалуйста, не добавляйте повторяющиеся сообщения для одной и той же проблемы, объедините свои сообщения, чтобы люди не тратили время на поиск и ответы на оба сообщения. Это обычно считается спамом http://stackoverflow.com/questions/10143308/android-autocompletetextview-filter-is-firing-late-for-the-first-search-only – Mayank
@Mayank ссылка выше не работает ... пожалуйста, проверьте –
Я думаю, что пользователь удалил сообщение, поэтому ссылка больше не работает. У него был такой же вопрос в другом посте, поэтому я просто указал ему, что это не очень хорошая идея, и его можно считать спамом. – Mayank