作爲標題,如何刪除由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!!!
}
要解決獲得所選項目的實際位置的問題:
是否有利用「ID」值的方法嗎?比如,爲每個項目分配一個id,然後希望onItemClick()會傳回正確的id。
就像我上面說過的,刪除過濾器(有可能),取回原來的100個項目,並執行一個一個的搜索。
這是最後的手段,我知道它會起作用,但我不想這樣做:一旦我得到所選文本的文本,我就會回到數據源(從一個數據庫),查詢這100個項目,並執行搜索。
另一個跛腳最後一招:要避免的開銷上再次訪問該數據庫在#3,當的onCreate(),同時創造一個ArrayAdapter,我用我自己的一個ArrayList記住所有那些100個字符串。
我是不是全都做錯了?從AutoCompleteTextView獲取所選項目的真實位置的「正確」方式是什麼?
非常感謝!
(我讀的地方,一些團購似乎是來自谷歌Android團隊說,應該使用getFirstVisiblePosition()來解決的位置,但我想不出如何。)
我正在做類似的事情! http://stackoverflow.com/questions/12854336/autocompletetextview-backed-by-cursorloader – toobsco42 2012-10-30 19:47:14