2010-04-19 30 views
14

我有一個ArrayAdapter環繞自定義對象的ArrayList。我想爲該適配器編寫一個自定義過濾器,以便當我調用getListAdapter().getFilter().filter("abc")時,該列表將通過「abc」的任意轉換進行過濾。如何在Android的ArrayAdapter中覆蓋過濾器?

我想我只是試圖覆蓋ArrayAdapter.getFilter(),但這需要我重新實現私人ArrayAdapter.ArrayFilter這需要訪問一堆ArrayAdapter的私人實例。

這樣做最簡單的方法是什麼?

+0

我也很想看到這個問題的答案。 – 2010-11-20 21:41:59

+3

我有同樣的問題。我最終寫了一篇關於這個問題的博客文章,並上傳了一個交替的適配器實現。我留下鏈接供將來參考:http://blogactivity.wordpress.com/2011/08/28/filterable-adapter/ – slezica 2011-08-28 17:22:55

回答

12

首先,看看source code of ArrayAdapter

你會注意到它有私人字段mFilter,它只用於getFilter()方法。所以,只需延長ArrayAdapter並覆蓋getFilter()即可返回您的Filter

最好實施FilterArrayFilter一樣:作爲私人內部類,因此它可以訪問ArrayAdapter的私人字段。

讓我知道如果這是足夠的信息來完成任務。

+2

通過這個想法,幫助我理解一些東西。我已經檢查了ArrayAdapter和內部ArrayFilter類的來源,並且我注意到ArrayFilter直接操縱ArrayAdapter的私有成員變量。如果我正確理解您的解決方案,我是否需要實現自己的Adapter和Filter類?這是我自己得出的結論。我希望賞金能夠帶來更多有創意的解決方案,而這些解決方案涉及較少的定製代碼。但是,我認爲這是不可能的,因爲ArrayFilter是私有的。 – 2010-11-22 14:09:41

+0

感謝您的建議彼得,但這實質上是我希望避免的解決方案。正如yock提到的,它需要複製或重新實現大量的代碼。如果可能的話,我想找一個更優雅的解決方案 – emmby 2010-11-22 18:47:11

+0

您只需要擴展'ArrayAdapter'並覆蓋'getFilter()' - 大約5行代碼。然後你必須實現一個'Filter'。目前ArrayFilter是60行代碼。我不知道你想要做什麼樣的過濾,但它可能會有相似的長度。我可以在30分鐘內寫下這個問題,但這個問題已經開放3天了。 – 2010-11-22 19:49:15

相關問題