目标:
我想从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;
}
}
提前致谢
答案 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();
这是第一次不工作的问题,但这是在我的情况下没有其他工作的唯一方法。希望能帮助到你 感谢