2013-10-28 72 views
0

我已經使用自定義適配器實現了AutoCompleteTextView。AutoCompleteTextView不顯示建議

在getFilter()方法我從服務器獲取建議並顯示它。 現在,如果我慢慢輸入一個字符,它的效果非常好,但是當我開始快速輸入時,它有時會顯示建議。

有關如何處理此問題的任何建議?

@Override 
public Filter getFilter() { 
    Log.i("TIME", "Called getfilter"); 
    Filter filter = new Filter() { 
     @Override 
     protected FilterResults performFiltering(CharSequence constraint) { 
      Log.i("TIME", "1"); 
      Log.i("TIME", "2 : " + constraint); 
      FilterResults filterResults = new FilterResults(); 
      if (constraint != null) { 
       // Retrieve the autocomplete results. 
       long t1 = System.currentTimeMillis(); 
       autoCompletItems = autocomplete(constraint.toString()); 
       long t2 = System.currentTimeMillis(); 
       Log.i("TIME", "Required Milis : " + (t2 - t1)); 
       Log.i("TIME", "Total Items : " + autoCompletItems.size()); 
       // Assign the data to the FilterResults 
       filterResults.values = autoCompletItems; 
       filterResults.count = autoCompletItems.size(); 
      } 
      Log.i("TIME", "3: " + filterResults.count); 
      return filterResults; 
     } 

     @Override 
     protected void publishResults(CharSequence constraint, 
       FilterResults results) { 
      Log.i("TIME", "Called publishResults" + " , Count : " 
        + results.count); 
      clear(); 
      if (results != null && results.count > 0) { 

       notifyDataSetChanged(); 
      } else { 
       notifyDataSetInvalidated(); 
      } 
     } 

     @Override 
     public CharSequence convertResultToString(Object resultValue) { 
      AutoCompletItem autoCompletItem = (AutoCompletItem) resultValue; 
      return autoCompletItem.getProductName(); 
     } 

    }; 

    return filter; 
} 

protected ArrayList<AutoCompletItem> autocomplete(String string) { 
    ArrayList<AutoCompletItem> resultList = null; 

    HttpURLConnection conn = null; 
    StringBuilder jsonResults = new StringBuilder(); 
    try { 
     Log.i(LOG_TAG, "2.1"); 
     StringBuilder sb = new StringBuilder(URL_GET_SUGGESTIONS_SERVICE); 
     URL url = new URL(sb.toString()); 

     conn = (HttpURLConnection) url.openConnection(); 
     conn.setRequestMethod("POST"); 
     conn.setDoInput(true); 
     conn.setDoOutput(true); 
     InputStream inputStream = conn.getInputStream(); 
     Log.i(LOG_TAG, "2.2"); 
     int available = inputStream.available(); 
     Log.i(LOG_TAG, "2.3" + " Total available : " + available); 
     byte[] data = new byte[available]; 
     inputStream.read(data); 
     Log.i(LOG_TAG, "2.4"); 
     ItemContainer container = (ItemContainer) deserialize(data); 
     Log.i(LOG_TAG, "2.5"); 
     resultList = (ArrayList<AutoCompletItem>) container 
       .getSerializable(); 
     Log.i(LOG_TAG, "2.6"); 
     System.out.println("Check Data"); 
    } catch (MalformedURLException e) { 
     Log.i(LOG_TAG, "2.exception " + e); 
     Log.e(LOG_TAG, "Error processing Places API URL", e); 
     return resultList; 
    } catch (IOException e) { 
     Log.i(LOG_TAG, "2.exception " + e); 
     Log.e(LOG_TAG, "Error connecting to Places API", e); 
     return resultList; 
    } finally { 
     Log.i(LOG_TAG, "2.finally "); 
     if (conn != null) { 
      conn.disconnect(); 
     } 
    } 

    return resultList; 
} 

回答

-1

真的很遲纔回答,但對於那些可能正在尋找的人來說。

AutoCompleteTextView myAutoCompleteTV; 

如果您在飛行(可能帶有的AsyncTask:要能回來UI線程後)填充您的AutoCompleteTextView你可以添加一個TextWatcher喜歡如下

myAutoCompleteTV.addTextChangedListener(this);

這可以讓用戶在輸入他知道他正在查找的角色時單獨填充它。當他被卡住或需要建議時,他會停下來,這就是當myAutoCompleteTV將不再查詢(記得我假設你有一個巨大的列表)

在三個觀察者之一,強制過濾器顯示建議匹配什麼是目前在myAutoCompleteTV

@Override 
public void onTextChanged(CharSequence s, int start, int before, int count) 
{ 
    ArrayAdapter<String> myAdapter = (ArrayAdapter<String>) myAutoCompleteTV.getAdapter 
    myAdapter.getFilter().filter(myAutoCompleteTV.getText().toString()); 
    myAdapter.notifyDataSetChanged(); 
} 
+0

myAutoCOmpleteTV是AutoCompleteTextView ..它不具有任何在該解決方案中使用的方法。 – reidisaki

+0

@reidisaki回答編輯 – Br0thazS0ul

+1

@reidisaki如果你是下來的選民,我看到你有豐富的Android知識。編輯一個同行所犯的錯誤比向下投票和評論要好。 – Br0thazS0ul

相關問題