2016-04-12 8 views
0

Ich habe eine AutoCompleteTextView in meinem Layout. Nachdem der Benutzer das erste Zeichen eingegeben hat, möchte ich einen API-Aufruf durchführen, den ich in einer AsyncTask mache. Ich habe addTextChangedListener verwendet und mache den API-Aufruf für TextChanged. Das Problem besteht jedoch darin, dass der API-Aufruf jedes Mal ausgeführt wird, wenn der Benutzer Änderungen an AutoCompleteTextView vornimmt.Android AutoCompleteTextView: Führen Sie einen AsyncTask-Aufruf nur einmal auf TextChange

Aber ich möchte, dass der API-Aufruf nur einmal erfolgt, das heißt, nachdem das erste Zeichen eingegeben wurde. Wie erreiche ich das?

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_places_search); 
    search_airport = (AutoCompleteTextView) findViewById(R.id.place_search); 
    autocompleteadapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, airports); 
    search_airport.setAdapter(autocompleteadapter); 
    search_airport.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) { 
      mAirport = new AsyncTaskAirport(search_airport.getEditableText().toString().substring(0, 1)); 
      mAirport.execute((Void) null); 

     } 

     @Override 
     public void afterTextChanged(Editable s) { 


     } 
    }); 


} 
+1

Was ist, wenn der Benutzer ein Zeichen eingibt, löscht es dann und gibt dann ein anderes Zeichen ein? Was passiert, wenn der Benutzer ein Zeichen eingibt, dann auf die erste Position zurückfährt und vor der ersten ein anderes Zeichen einfügt? –

+0

@DougStevenson Yeah ... Ich muss diese Fälle auch berücksichtigen .. Kannst du mir sagen, wie ich all diese Szenarien erreichen kann? –

Antwort

1

dies versuchen,

@Override 
public void onTextChanged(CharSequence s, int start, int before, int count) { 
    if(s.toString().trim().length()==1){ 
     mAirport = new AsyncTaskAirport(search_airport.getEditableText().toString().substring(0, 1)); 
     mAirport.execute((Void) null); 
    } 

} 
+0

Facepalm. Vielen Dank. Elegante und einfache Lösung. –

0

Sie Ihr Problem mit einem timer.Here lösen kann, ist, wie

@Override 
public void onTextChanged(CharSequence s, int start, int before, int count) 
{ 
    int COMPLETION_DELAY = 2000; 
    if (timer != null) 
    { 
     timer.cancel(); 
     timer.purge(); 
     timer = null; 
    } 
    timer = new Timer(); 
    timer.schedule(new TimerTask() 
    { 
     @Override 
     public void run() 
     { 
      new Handler(Looper.getMainLooper()).post(new Runnable() 
      { 
       @Override 
       public void run() 
       { 
        if (s.toString().length() >= appCompatAutoCompleteTextView.getThreshold()) 
        { 
         //CALL WebService Here 
        } 
       } 
      }); 
     } 
    }, COMPLETION_DELAY); 
} 

jetzt Ihr Dienst nicht in Anspruch genommen werden, wenn die Benutzer Änderungen vornehmen, während in der Eingabe Auto vervollständigen. Der Service wird nur angerufen, sobald der Benutzer + 2 Sekunden anhält.

Verwandte Themen