繁体   English   中英

第一次选择一个项目时,AutoCompleteTextView下拉列表没有隐藏

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM