2016-04-12 17 views
0

レイアウトにAutoCompleteTextViewがあります。ユーザーが最初の文字を入力した後、私はAsyncTaskでやっているAPI呼び出しをしたいと思います。私はaddTextChangedListenerを使用して、私はTextChangedでAPI呼び出しを行っています。しかし、問題は、ユーザーがAutoCompleteTextViewを変更するたびにAPIコールが実行されていることです。Android AutoCompleteTextView:TextChangeでAsyncTaskコールを1回だけ実行します。

しかし、私は最初の文字が入力された後であるAPI呼び出しが一度しか起こらないようにしたいと思います。これをどのように達成するのですか?

@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

ユーザーが文字を入力してから削除した後、別の文字を入力するとどうなりますか?ユーザーが文字を入力した後、最初の位置に戻って最初の文字の前に別の文字を挿入するとどうなりますか? –

+0

@DougStevensonええと...これらのケースも考慮する必要があります。これらのシナリオをどのように達成できるか教えてください。 –

答えて

1

@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。ありがとう。エレガントでシンプルなソリューション。 –

0

あなたはtimer.Hereであなたの問題を解決することができ、これを試してみてくださいで入力中にユーザーが変更を行ったときに、今、あなたのサービスが呼び出されることはありませんか

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

です自動完了。サービスはユーザが2秒後に一度だけ呼び出されます。

関連する問題