1

標的 :

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

}

前もって感謝します

4

1 に答える 1