2012-04-11 7 views
1

Ziel vorschlagen: ein paar Strings aus webservice und bevölkern AutoCompleteTextView mit them.ThisAutoCompleteTextView nicht nur für FIRST SUCHE

ich will, ist einfach zu bekommen, aber was will ich eigentlich suchen (aufrufen webservice) beginnen beim Tippen fertig.

Ich meine, zum Beispiel, ich etwas eingeben und 3 Sekunden nach der Eingabe beendet, AutoCompleteTextView würde gefüllt und Vorschläge angezeigt werden.

Was ich bisher tat:

Wie Sie in der unten stehenden Code sehen können, habe ich eine CountDownTimer dies zu erreichen. Ich setze es 3 Sekunden und starte es in OnTextChanged. Als Benutzertyp lösche ich CountDownTimer und erstelle eine neue Instanz davon und starte es erneut.

Also, wann immer Benutzer -on jede Taste drücken- Ich setze Zähler zurück.

Danach, rufe ich meine Methode - die Webservice aufrufen und AutoCompleteTextView auffüllen - in CountFortTimer OnFinish().

Problem:

Wenn ich die Eingabe fertig ist, alles wie erwartet funktioniert, wie ich im Debug-Modus sehen. Aber Vorschläge kommen nicht nur für die erste Suche.

Ich meine, es funktioniert auch, aber AutoCompleteTextView wird nicht nur für ERSTE MAL mit Daten gefüllt.

Hinweis:

Ich rufe Webservice sowohl synchrone als auch asynchrone Art und Weise.

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(); 
     } 

    }); 

Hier ist meine CountDownTimer Klasse

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) { 

    } 
    } 

Hier ist meine Methode, webservice in synchronen Weise

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(); 

} 

Hier aufzurufen ist meine Methode Webservice in asynchron

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; 
    } 

} 
aufzurufen

Vielen Dank im Voraus

+0

bitte nicht doppelte Beiträge für das gleiche Problem hinzufügen, füge deine Beiträge, damit die Leute ihre Zeit nicht verschwenden suchen und beide Beiträge zu beantworten. Dies wird in der Regel als Spamming betrachtet http://StackOverflow.com/Questions/10143308/Android-AutocompletedTextview-Filter-ISFire-Late-for-the-first-search-only – Mayank

+0

@Mayank der Link oben funktioniert nicht ... überprüfen Sie bitte –

+0

Ich denke, Benutzer haben seinen Beitrag gelöscht, deshalb funktioniert der Link nicht mehr. Er hatte die gleiche Frage in einem anderen Post, also habe ich ihn darauf hingewiesen, dass es keine gute Idee ist, das zu tun und als Spamming betrachtet werden kann. – Mayank

Antwort

0

Hier ist, was Sie tun können: i den Schwellenwert 3 auf die automatische Vervollständigung Textansicht

atvSearchPatient.setThreshold(3); 

gelten den Text Beobachter Hörer wie unten gesetzt haben:

//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); 

      } 
     } 
    }); 

Bei Ihrem ersten Aufruf haben Sie die API mit Nullwerten und für zweite und aufeinanderfolgende Aufrufe mit der Zeichenfolge aus dem AutoVervollständigen Textansichtsfeld wie oben.und dann als Antwort gelten die Adapter wie unten:

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(); 

Es ist weired Problem für die erste Zeit nicht arbeiten, aber das ist der einzige Weg, in meinem Fall nichts funktioniert anders. hoffe, es hilft Danke