2012-04-11 2 views
1

Цели: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; 
    } 

} 

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

+0

Пожалуйста, не добавляйте повторяющиеся сообщения для одной и той же проблемы, объедините свои сообщения, чтобы люди не тратили время на поиск и ответы на оба сообщения. Это обычно считается спамом http://stackoverflow.com/questions/10143308/android-autocompletetextview-filter-is-firing-late-for-the-first-search-only – Mayank

+0

@Mayank ссылка выше не работает ... пожалуйста, проверьте –

+0

Я думаю, что пользователь удалил сообщение, поэтому ссылка больше не работает. У него был такой же вопрос в другом посте, поэтому я просто указал ему, что это не очень хорошая идея, и его можно считать спамом. – Mayank

ответ

0

Вот что вы можете сделать: я установить пороговое значение 3

atvSearchPatient.setThreshold(3); 

применить текст наблюдател слушателя автозаполнения зрения текста, как показано ниже:

//here set the text watcher 
    atvSearchPatient.addTextChangedListener(new TextWatcher() { 
     @Override 
     public void beforeTextChanged(CharSequence s, int start, int count, int after) { 

     } 

     @Override 
     public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { 

     } 

     @Override 
     public void afterTextChanged(Editable editable) { 
      String str = atvSearchPatient.getText().toString().trim(); 
      if (str.length() >2) { 

        searchPatient(str); 

      } 
     } 
    }); 

на ваш первый API для вызова вызовов с нулевыми значениями, а для вторых и последовательных вызовов с строкой из поля автозаполнения текста, как указано выше.а затем в ответ применить адаптер, как показано ниже:

this.nameList.clear(); 
    if (nameList.size() > 0) { 
     this.nameList.addAll(dataFromResponseList); 
     atvSearchPatient.setAdapter(null); 
     ArrayAdapter<String> adapter = new ArrayAdapter<>(
       this, android.support.v7.appcompat.R.layout.select_dialog_item_material, nameList); 
     atvSearchPatient.setAdapter(adapter); 
     adapter.notifyDataSetChanged(); 
     atvSearchPatient.showDropDown(); 

Это weired проблема впервые не работает, но это единственный способ работы в моем случае ничего. надеюсь, что это поможет Thanks

Смежные вопросы