![](/img/trans.png)
[英]Clicked drop-down item in AutoCompleteTextView does not respond on the first click
[英]AutoCompleteTextView drop down list is not hiding when an item selected for the first time
当用户在AutoCompleteTextView中键入内容时,我正在异步任务中从数据库中获取数据。 我在AutoCompleteTextView中有带有TextWatcher的addTextChangedListener。 问题在于,当用户从建议列表中选择一个项目时,此数据将输入到文本查看器中,但下拉列表甚至对用户可见。 因为,当用户从下拉列表中选择一项时,TextWatcher.onTextChanged()会再次被调用,并且此调用将发送一个新请求。 这是第一次发生所选项目,如果用户再次单击该项目,则不会显示下拉列表。
那么,当用户第一次从建议的列表中选择一项时,如何隐藏此下拉列表呢?
我已经做到了:
autoComplete = (AutoCompleteTextView) findViewById(R.id.my_text);
final TextWatcher yourTextWatcher = new TextWatcher() {
@Override
public void afterTextChanged(Editable s) {
Log.d(TAG, "afterTextChanged:" + s.toString());
afterTextChanged = s.toString();
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
Log.d(TAG, "beforeTextChanged:" + s.toString());
beforeTextChanged = s.toString();
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
Log.e(TAG, "beforeTextChanged:" + beforeTextChanged + ",afterTextChanged:" + afterTextChanged + ",onTextChanged:" + s.toString());
if (!beforeTextChanged.equals(s.toString())) {
new doPopulate().execute(s.toString());
}
}
};
Logcat:在输入“ go”后选择某项(Google)时
beforeTextChanged:go
beforeTextChanged:go,afterTextChanged:go,onTextChanged:Google
afterTextChanged:Google
如果用户选择,则保留一个布尔标志,然后向您的AutoCompleteTextView添加onItemClickListener,即
boolean selectedText = false;
autoComplete.setOnItemClickedListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
selectedText = true;
}
});
然后在TextWatcher中检查selectedText
标志:
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
Log.e(TAG, "beforeTextChanged:" + beforeTextChanged + ",afterTextChanged:" + afterTextChanged + ",onTextChanged:" + s.toString());
if (!beforeTextChanged.equals(s.toString()) && !selectedText) { //Here we check selectedText
new doPopulate().execute(s.toString());
}
selectedText = false; //Clear selectedText flag
}
干杯
在onTextChanged方法中添加以下代码行: if(autoComplete.isPerformingCompletion()) { // An item has been selected from the list. return; }
if(autoComplete.isPerformingCompletion()) { // An item has been selected from the list. return; }
我已经在自动完成下拉列表中显示的ArrayAdapter项之前添加了双倍空格,并且当用户从下拉列表中选择一项并且触发了onTextChanged时,请检查条件字符串是否等于双倍空格,然后执行asyn任务。
文本更改的代码
autoComplete = (AutoCompleteTextView) findViewById(R.id.autoComplete);
autoComplete.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
String SearchProd = s.toString();
if (SearchProd.length()>=2){
String SearchProdSpace=SearchProd.substring(0,2);
if(SearchProdSpace!=" " && itemselected==false)
{
try{
new GetProductData(SearchProd).execute();
}catch(Exception e){ e.printStackTrace();}
}
}
itemselected=false;
}
AsyncTask代码
public class GetProductData extends AsyncTask<String, Void, Void> {
private ProgressDialog Dialog = new ProgressDialog(context);
GetProductData(String str) {
try {
qryText= URLEncoder.encode(str, "UTF-8");
} catch (UnsupportedEncodingException e1) {
e1.printStackTrace();
}
}
protected void onPreExecute() {
Dialog.setMessage("Loading ...");
Dialog.setCanceledOnTouchOutside(false);
Dialog.show();
}
@Override
protected Void doInBackground(String... params) {
try {
JSONObject json = new JSONObject(getProductData());
ProductList=new ArrayList<String>();
Status = json.getBoolean("Status");
if (Status) {
JSONArray Products=json.getJSONArray("Products");
if (Products.length() > 0) {
for (int i = 0; i < Products.length(); i++) {
JSONObject ProductObj = Products.getJSONObject(i);
ProductList.add(" "+ProductObj.getString("Name"));
}
}
} else {
Error = json.getString("Message");
}
} catch (JSONException e) {
Error = e.getMessage();
}
return null;
}
protected void onPostExecute(Void unused) {
Dialog.dismiss();
if (Error != null) {
Toast.makeText(context, "Some Error Occured : " + Error,
Toast.LENGTH_LONG).show();
} else {
try {
ArrayAdapter<String> Arrayadapter = new ArrayAdapter<String>(context, android.R.layout.simple_dropdown_item_1line,ProductList);
Arrayadapter.setNotifyOnChange(true);
autoComplete.setAdapter(Arrayadapter);
autoComplete.showDropDown();
autoComplete.requestFocus();
autoComplete.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
itemselected=true;
String itemstr=ProductList.get(position).trim();
autoComplete.setText(itemstr);
}
});
// ItemName.setSelected(selected)
} catch (Exception e) {e.printStackTrace(); }
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.