2011-03-31 101 views
3

作爲標題,如何刪除由AutoCompleteTextView使用的ArrayAdapter上的過濾以獲取原始列表?如何刪除AutoCompleteTextView中使用的ArrayAdapter上的篩選器?

多一點背景:

這一切都來自可悲的事實是,在傳遞給onItemClick()的「位置」值是沒用的開始。 「位置」是指陣列過濾後的位置,但我需要知道它的實際位置。所以,我試圖做的是當我得到所選項目的文本(通過使用getItemAtPosition(position)),我將它與支持ArrayAdapter的原始字符串數組逐一比較。但是,我發現當調用onItemClick()時,適配器已經過濾,我不再有權訪問原始數組。所以我想如果我可以刪除過濾器,也許我可以找回原始數組並查找其中的選定項目。

ArrayAdapter<String> mAdapter; 

public void onCreate() { 

    // Create an adapter and remembere it as a class member. 
    mAdapter = new ArrayAdapter<String>(this, layoutId); 

    // Add 100 strings to it and attach it to an AutoCompleteTextView 
    for (int i = 0; i < 100; i++) 
     mAdapter.add("random text"); 
    ((AutoCompleteTextView)findViewById(id)).setAdapter(mAdapter); 
} 

@Override 
public void onItemClick(AdapterView<?> actv, View view, int position, long id) { 

    if (actv.getAdapter().equals(mAdapter)) 
     Log.d("The adapter contained in actv is the same one I created earlier."); 

    // And, I can get the text of the item the user selected 

    String selected = (String)actv.getItemAtPosition(position); 

    // However, although the adapter passed in is still the same one, but the 
    // number of items in it is only 1! Because the array has been filtered. 

    int numItems = actv.getAdapter.getCount(); 

    // So, I'm thinking if I can somehow remove the filtering here, then I can 
    // get back those 100 items, and do a search like following: 

    for (int i = 0; i < actv.getAdapter.getCount(); i++) 
     if (selected == actv.getAdapter.getItem(i)) 
      break; // Eureka!!! 
} 

要解決獲得所選項目的實際位置的問題:

  1. 是否有利用「ID」值的方法嗎?比如,爲每個項目分配一個id,然後希望onItemClick()會傳回正確的id。

  2. 就像我上面說過的,刪除過濾器(有可能),取回原來的100個項目,並執行一個一個的搜索。

  3. 這是最後的手段,我知道它會起作用,但我不想這樣做:一旦我得到所選文本的文本,我就會回到數據源(從一個數據庫),查詢這100個項目,並執行搜索。

  4. 另一個跛腳最後一招:要避免的開銷上再次訪問該數據庫在#3,當的onCreate(),同時創造一個ArrayAdapter,我用我自己的一個ArrayList記住所有那些100個字符串。

我是不是全都做錯了?從AutoCompleteTextView獲取所選項目的真實位置的「正確」方式是什麼?

非常感謝!

(我讀的地方,一些團購似乎是來自谷歌Android團隊說,應該使用getFirstVisiblePosition()來解決的位置,但我想不出如何。)

+0

我正在做類似的事情! http://stackoverflow.com/questions/12854336/autocompletetextview-backed-by-cursorloader – toobsco42 2012-10-30 19:47:14

回答

0

這實際上是很容易解決..而不是每個元素添加到適配器,因爲你得到它(我假設你的隨機文本部分只是爲了舉例的目的),而是使用以下代碼:

首先建立你的數組到一個變量,稱之爲myArray .. 然後像這樣初始化您的適配器:

mAdapter = new ArrayAdapter<String>(this, layoutId, myArray); 

現在確保myArray是一個類變量,所以你可以從類中的任何其他地方引用它。當然,如果你需要從另一個類訪問它,你想爲它創建一個getter ...然後您可以輕鬆遍歷數組以查看所選值是否在數組中。您將擁有整組數據,而不是嘗試從適配器中獲取。

下面是使用驗證的容貌相似,用例一個很好的例子: Android, Autocomplettextview, force text to be from the entry list

+0

我覺得我說得有點太快..我很困惑,爲什麼你會添加每個元素到適配器(它在內部創建自己的數據結構,但你不願意創建自己的數據結構來存儲數據)......如果你真的擔心資源,你應該使用CursorAdaptor(如果數據來自數據庫)。還要注意,在示例I發送給您數組已排序,您可以執行二進制搜索以檢查值是否在數組中 - O(log n)而不是O(n)。 – 2011-05-05 05:16:52

0

就我而言,我的地址可以通過自動填充或點擊地圖進行設置。如果用戶點擊地圖,則應將editText文本設置爲從地圖中選擇的地址,在這種情況下,應暫時禁用過濾。

我這樣的代碼:

public void OnAddressFound(String address) { 
       // Temporary disable autocomplete 
       editTextSearch.setAdapter(null); 
       editTextSearch.setText(address); 
       // Enable autocomplete again 
       setAutoCompleteAdapter(); 
      } 

其中setAutoCompleteAdapter()時的onCreate過程中暫時禁用調用,並再次/啓用過濾器:

void setAutoCompleteAdapter() { 
    PlacesAutoCompleteAdapter adapter = new PlacesAutoCompleteAdapter(this, R.layout.item_autocomplete_map_search, autoCompleteList); 
    editTextSearch.setAdapter(adapter); 
    adapter.notifyDataSetChanged(); 
} 

希望其對您有幫助也。

相關問題