如何在Android的ArrayAdapter中覆盖过滤器?

15
我有一个包装在自定义对象 ArrayList 中的 ArrayAdapter。 我想为该适配器编写自定义过滤器,以便当我调用getListAdapter().getFilter().filter("abc")时,列表将按“abc”的任意转换进行过滤。
我认为我可以尝试覆盖 ArrayAdapter.getFilter(),但是这需要我重新实现私有的 ArrayAdapter.ArrayFilter ,这需要访问一堆 ArrayAdapter 的私有实例。
那么最简单的方法是什么?

我也很想看到这个问题的答案。 - Mike Yockey
3
我有同样的问题。最终我写了一篇关于这个问题的博客,并上传了一种可替代的适配器实现。我留下链接供日后参考:http://blogactivity.wordpress.com/2011/08/28/filterable-adapter/ - salezica
1个回答

12

首先,查看 ArrayAdapter 的源代码

你会发现它有一个名为 mFilter 的私有字段,只在 getFilter() 方法中使用。所以,只需扩展 ArrayAdapter 并重写 getFilter() 来返回你的 Filter

最好像 ArrayFilter 一样实现你的 Filter:作为私有内部类,这样它就可以访问 ArrayAdapter 的私有字段。

如果这些信息足够你完成任务,请告诉我。


2
思考一下,帮我理解一些事情。我已经检查了ArrayAdapter和内部ArrayFilter类的源代码,并注意到ArrayFilter直接操作ArrayAdapter的私有成员变量。如果我正确理解您的解决方案,那么我不需要实现自己的适配器和过滤器类吗?这是我自己得出的结论。我希望赏金能够带来更具创意的解决方案,涉及更少的自定义代码。然而,考虑到ArrayFilter是私有的,我认为这是不可能的。 - Mike Yockey
谢谢你的建议,Peter,但那基本上是我希望避免的解决方案。正如 yock 所提到的,它需要复制或重新实现大量代码。如果可能的话,我希望找到更优雅的解决方案。 - emmby
你只需要扩展ArrayAdapter并重写getFilter()方法 - 大约只需5行代码。然后你需要实现一个Filter。目前的ArrayFilter有60行代码。我不知道你想做什么样的过滤,但它可能会有类似的长度。我可以在30分钟内完成这项工作,然而这个问题已经开放了3天。 - Peter Knego
你是对的 - ArrayFilter使用了许多ArrayAdapter的私有字段。然后,您只需要复制整个ArrayAdapter并更改所需的代码。虽然不太“优雅”,但它可以工作。这比我预期的工作量不多。 - Peter Knego
1
Peter,我已经授予了奖励。但实际上,我希望学习一种替代方法,而不是直接复制整个Android类,只为更改performFiltering方法中的两个方法名称。至少你让我对代码的阅读和理解有了信心,这肯定是值得的。谢谢。 - Mike Yockey
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接