AutoCompleteTextView不建议仅进行FIRST SEARCH

时间:2012-04-11 12:43:12

标签: android autocompletetextview countdowntimer

目标:

我想从webservice获取一些字符串并用它们填充AutoCompleteTextView。这很简单,但我想要的是在键入完成后开始搜索(调用webservice)。

我的意思是,例如,我键入内容并在键入完成后3秒,将填充AutoCompleteTextView并显示建议。

到目前为止我做了什么:

正如您在下面的代码中看到的,我使用了CountDownTimer来实现这一目标。我将其设置为3秒并在OnTextChanged中启动它。当用户输入时,我清除CountDownTimer并创建它的新实例并再次启动它。

因此,每当用户键入-on每按一次键时 - 我重置计数器。

之后,我在CountDownTimer的OnFinish()中调用我的方法 - 调用webservice并填充AutoCompleteTextView。

问题:

当我完成输入时,一切都按预期工作,我在调试模式下可以看到。但建议不会仅用于第一次搜索。

我的意思是,它也能正常工作,但AutoCompleteTextView只会在第一时间填充数据。

注意:

我以同步和异步方式调用webservice。

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

    }
    }

这是我以同步方式调用webservice的方法

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

}

这是我以异步方式调用webservice的方法

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

}

提前致谢

1 个答案:

答案 0 :(得分:0)

以下是您可以做的事情: 我已将阈值设置为3

 atvSearchPatient.setThreshold(3);

在自动填充文本视图上应用文本观察者监听器,如下所示:

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

            } 
        }
    });
第一次调用时,

使用空值触发API,并使用自动完成文本视图字段中的字符串进行第二次和连续调用,然后作为响应应用适配器,如下所示:

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

这是第一次不工作的问题,但这是在我的情况下没有其他工作的唯一方法。希望能帮助到你 感谢