2008年7月7日 星期一

客製化 AutoCompleteTextView 中的 Filter 功能

How to customize the filtering function for AutoCompleteTextView widget?

這裡 我提過,另一個縮小 AutoCompleteTextView 的方法,就是自己寫個 ArrayAdapter,然後在 getView() 中,產生個 TextView 給 AutoCompleteTextView。這簡單的程式片段,大致如下。在 getView() 函式中,自己 new 個 TextView widget。

不過,要寫個可以給 AutoCompleteTextView 用的 ArrayAdapter,可沒表面上看起來那麼地簡單。因為,你還要在這個類別裡,寫個 Filterable 介面的實現才行。

這個 Filterable interface 就是用來,從現有的全部結果中,依照你輸入的字元,過濾出符合的結果。而 AutoCompleteTextView ,則只單純地列出 Filterable 所傳回的結果。例如,當你輸入個 B 字元時,AutoCompleteTextView 就藉由 Filterable 的函式,列出只有 B 開頭的國家。這也是 AutoCompleteTextView 中,最主要的功能。

不過,如果你想要列出所有的國家,AutoCompleteTextView 目前可沒這樣的功能。最簡單的方式,就是自己寫個 Filterable 的實現。所以啦,Filterable 可不是只能用來過濾結果。你可拿它來做任何事,AutoCompleteTextView 根本不管他傳回的內容是什麼,他只單純地列出 Filterable 所傳回的結果。

延續 這裡 的例子,我將他改成,如果只輸入 "*" 這個字元,就列出所有的國家。如果是其他字元,就依照原先的用法,列出符合輸入字元的國家。

在 Filterable 這個介面中,你要實現這兩個方法。

底下就是,如何在這兩個函式中,實現用 "*" 列出所有國家。

還沒完,接下來,你還要在你自己的 ArrayAdapter (這裡的 CntyListAdapter),實現下列的方法才行。

好了,最後的執行結果就像這樣。你想到要利用 Filterable ,來做出什麼特別功能嗎?

沒有留言:

張貼留言