2012-07-16 99 views
5

我有一個MultiAutoCompleteTextView,它允許您輸入多個條目並顯示自動填充建議。我提交數據時出現問題。我將所有輸入的字符串添加到下拉列表中,但我嘗試對數據進行排序失敗。上執行的代碼提交:Sorting ArrayAdapter for Android

final private Comparator<String> comp = new Comparator<String>() { 
    public int compare(String e1, String e2) { 
     return e1.toString().compareTo(e2.toString()); 
    } 
}; 

((ArrayAdapter<String>) autoCompleteView.getAdapter()).add(getString());      
((ArrayAdapter<String>) autoCompleteView.getAdapter()).sort(comp); 

上點擊autoCompleteView發生了什麼代碼:

 view.setOnClickListener(new OnClickListener() { 

      public void onClick(View v) { 
       adapter.getFilter().filter(null); 
       //adapter.sort(comp); 
       view.showDropDown(); 
      } 
     }); 

任何人都可以找到什麼毛病我在做什麼?

編輯:一些更多的信息,從@Sam

private ArrayList<String> array = new ArrayList<String>(); 
private ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_dropdown_item_1line, 
     array); 

private void setUpAutoComplete(final MultiAutoCompleteTextView view) 
{ 
    array.add("test string"); // this is successfully added to the drop down list 
    Collections.sort(array, comp); 
    adapter.notifyDataSetChanged(); 
} 

private void onSubmit() 
{ 
    array.add(getString()); // this fails to add 
    adapter.notifyDataSetChanged(); 
} 
將更改合併

回答

9

,但我嘗試整理後的數據失敗

這是一個有點含糊。但我會猜測。

首先你做一些多餘的:

return e1.toString().compareTo(e2.toString()); 

由於e1e2已經字符串,你不需要調用String#toString()。這個基本的字符串比較器已經存在。所以你不需要這些。

更好的方法是對列表進行排序,而不是適配器。只需使用集合排序方法:

List<String> list = new ArrayList<String>(); 
list.add(getString()); 
... 

Collections.sort(list); 
adapter.notifyDataSetChanged(); 

通知我改變adapter.add()list.add()。我這樣做是因爲adapter.add()調用list.add()adapter.notifyDataSetChanged()但適配器不應該更新,直到新列表進行排序。

+0

謝謝。我已將此代碼添加到提交時執行的部分中,但下拉列表根本不會使用新條目進行更新。當我將代碼添加到適配器初始化的部分中時,添加的字符串已成功添加。這聽起來像(線程)無法修改現有數據的問題嗎? – Flash 2012-07-17 19:06:36

+1

我不明白你在哪裏使用線程或整體上下文,所以我不能確定... – Sam 2012-07-17 19:31:38

+0

對不起,請參閱我對原始問題的編輯。 – Flash 2012-07-17 19:41:49