標的 :
Web サービスからいくつかの文字列を取得し、それらを AutoCompleteTextView に入力したいと考えています。これは簡単ですが、入力が終了したら検索を開始する (Web サービスを呼び出す) ことです。
たとえば、何かを入力すると、入力が完了してから 3 秒後に AutoCompleteTextView が読み込まれ、候補が表示されます。
私がこれまでにやったこと:
以下のコードでわかるように、これを実現するために CountDownTimer を使用しました。3 秒に設定し、OnTextChanged で開始します。ユーザーが入力すると、CountDownTimer をクリアして新しいインスタンスを作成し、再度開始します。
したがって、ユーザーが入力するたびに、キーを押すたびにカウンターをリセットします。
その後、CountDownTimer の OnFinish() で、Web サービスを呼び出して AutoCompleteTextView に値を設定するメソッドを呼び出します。
問題 :
入力を終えると、デバッグ モードで確認できるように、すべてが期待どおりに機能します。しかし、最初の検索だけでは候補は表示されません。
つまり、それも同様に機能しますが、AutoCompleteTextView には最初の時間だけデータが取り込まれません。
ノート :
同期と非同期の両方の方法で Web サービスを呼び出します。
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) {
}
}
これは、同期的にWebサービスを呼び出す私の方法です
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();
}
これが非同期でWebサービスを呼び出す方法です
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;
}
}
前もって感謝します