2012-10-16 33 views
13

我的主要活動代碼:AutoCompleteTextView不顯示下拉當我鍵入一個完整的字後,按空格鍵

// here you put all your data. 
String[] dataArray = { "Amit sharma Kumar", "Hisham Kumar Munner", 
     "Vineet John Chaturvedi", "Lucky Kumar Verma" }; 

ArrayList<String> alAutoCompleteList; 
AutoCompleteTextView acTV; 
ArrayAdapter<String> adapter1; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    // etAuto = (EditText) findViewById(R.id.etAuto); 
    acTV = (AutoCompleteTextView) findViewById(R.id.acTV); 
    // Arraylist 
    alAutoCompleteList = new ArrayList<String>(); 
    adapter1 = new ArrayAdapter<String>(MainActivity.this, 
      android.R.layout.simple_dropdown_item_1line,  alAutoCompleteList); 


    acTV.addTextChangedListener(new TextWatcher() { 

     @Override 
     public void onTextChanged(CharSequence s, int start, int before, 
       int count) { 
      // TODO Auto-generated method stub 
      if (acTV.enoughToFilter()) { 
       acTV.showDropDown(); 
       acTV.bringToFront(); 
      } 
     } 

     @Override 
     public void beforeTextChanged(CharSequence s, int start, int count, 
       int after) { 
      // TODO Auto-generated method stub 
      alAutoCompleteList.clear(); 
     } 

     @Override 
     public void afterTextChanged(Editable s) { 
      // TODO Auto-generated method stub 

      String acText = acTV.getText().toString().trim(); 

      for (String item : dataArray) { 

       if  (item.toLowerCase().contains(acText.toLowerCase())) { 
        alAutoCompleteList.add(item); 
       } 
      } 


      acTV.setThreshold(4); 
      acTV.setAdapter(adapter1); 
      acTV.showDropDown(); 

     } 
    }); 

當我搜索「夏爾馬」,之後建議熄滅按空格。我希望這些建議留在那裏。我試圖做所有事情,但沒有取得任何成功。有人可以幫忙嗎?

編輯: 有人可以嘗試在他們的模擬器上的代碼?只需在xml中添加一個AutoCompleteTextView並運行它。

回答

14

首先,你有什麼理由在AutoCompleteTextView上設置TextWatcher聽衆?如果你這樣做是爲了自己過濾數據,你不應該這樣做(因爲這個控件默認是這樣做的,而且你的代碼是不正確的)。

當我搜索「sharma」並在此之後按空格。建議去 了。我希望這些建議留在那裏。

這是因爲適配器和默認Filter實現這與它來,該AutoCompleteTextView引擎蓋下使用提供您在下拉列表中看到值的元素的發生。 ArrayAdapter的默認行爲是您看到的,您可以在this answer中找到解釋。解決方案是使用篩選器來實現自己的適配器,該篩選器將搜索整個適配器的行數據以獲取篩選字符串。我已經從SDK中獲取了ArrayAdapter類的代碼,並進行了小小的調整,以便在單詞後插入空格時過濾不會中斷。您可以找到類here作爲代碼大到發佈。就在班級拷貝到您的項目,並把它作爲一個正常的ArrayAdapter

FilterWithSpaceAdapter<String> adapter1; 
//... 
adapter1 = new FilterWithSpaceAdapter<String>(MainActivity.this, 
      android.R.layout.simple_dropdown_item_1line, dataArray); 
+1

此解決方案不起作用。如果你寫空白空間,請關閉下拉建議。 – cnbandicoot

+0

@cnbandicoot請提出一個新問題,提供有關您正在進行的操作的更多詳細信息。 – Luksprog

0

我覺得有文字守望問題,因爲自動完成文本視圖並不需要文本觀察家因爲自動監聽事件。你必須簡單地將你的數組傳遞給適配器而不是列表。 alAutoCompleteList在列表中沒有任何值。你從來沒有在列表中增加價值。

  • 無論是你必須做的,如: alAutoCompleteList.add( 「數據一」); alAutoCompleteList.add(「data two」);

  • 或將dataArray傳遞給適配器。 adapter1 = new ArrayAdapter(MainActivity.this, android.R.layout.simple_dropdown_item_1line,dataArray);

  • 無需使用文本觀察器。

1

您不需要Textwatcher,AutoCompleteTextView使用您設置的適配器的過濾器。默認的適配器通過在它們上調用toString()來過濾條目。當然,如果用戶輸入一個空格,這些值不再匹配。要實現這個自定義行爲,你不應該添加一個textwatcher,而是建立一個自定義適配器。您仍然可以擴展ArrayAdapter或SimpleAdapter。您可以通過覆蓋getFilter()和publishResults()來實現您的自定義過濾行爲(在您的情況下爲trim()調用)。 Herehere你可以找到如何做到這一點的例子。

2

首先,您不需要TextWatcherAutoCompleteTextView,因爲AutoCompleteTextView有其自己的方法來觀看文本,即MyWatcher。您需要使用:

setThreshold(3); 
final String[] AndroidDesk= getResources().getStringArray(R.array.clothname_arrays); 
ArrayAdapter<String> My_arr_adapter= new ArrayAdapter<String>(getApplicationContext(), 
      android.R.layout.simple_dropdown_item_1line,AndroidDesk);  
    cloths.setThreshold(1); 
    cloths.setAdapter(My_arr_adapter); 
    cloths.setOnItemClickListener(new OnItemClickListener() { 
    public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,long arg3) {        
    } 
    }); 
相關問題