【问题标题】:How to override filter in android's ArrayAdapter?如何覆盖 android 的 ArrayAdapter 中的过滤器?
【发布时间】:2011-02-09 22:08:43
【问题描述】:

我有一个 ArrayAdapter 包裹在自定义对象的 ArrayList 周围。我想为该适配器编写一个自定义过滤器,这样当我调用getListAdapter().getFilter().filter("abc") 时,列表将被“abc”的任意转换过滤。

我以为我会尝试覆盖 ArrayAdapter.getFilter(),但这需要我重新实现私有 ArrayAdapter.ArrayFilter,这需要访问一堆 ArrayAdapter 的私有实例。

最简单的方法是什么?

【问题讨论】:

标签: android filter android-arrayadapter


【解决方案1】:

首先,看看source code of ArrayAdapter

你会注意到它有私有字段mFilter,它只在getFilter() 方法中使用。因此,只需扩展 ArrayAdapter 并覆盖 getFilter() 即可返回您的 Filter

最好将Filter 实现为与ArrayFilter 相同的方式:作为私有内部类,因此它可以访问ArrayAdapter 的私有字段。

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

【讨论】:

  • 想通了,帮我理解一下。我检查了 ArrayAdapter 和内部 ArrayFilter 类的来源,我注意到 ArrayFilter 直接操作 ArrayAdapter 的私有成员变量。如果我正确理解您的解决方案,我是否不需要实现自己的适配器和过滤器类?这是我自己得出的结论。我希望赏金会带来更多创造性的解决方案,涉及更少的自定义代码。但是,考虑到 ArrayFilter 是私有的,我认为这是不可能的。
  • 感谢您的建议彼得,但这基本上是我希望避免的解决方案。正如 yock 提到的,它需要复制或重新实现大量代码。如果可能的话,我想找到一个更优雅的解决方案
  • 您只需要扩展 ArrayAdapter 并覆盖 getFilter() - 这大约是 5 行代码。然后你必须实现一个Filter。目前 ArrayFilter 是 60 行代码。我不知道您想进行哪种过滤,但它可能具有相似的长度。我可以在 30 分钟内写完这篇文章,但这个问题已经开放了 3 天。
  • 如果你告诉我你想做什么样的过滤,我会写给你的,只是为了好玩。
  • 彼得,我已经获得了赏金。真的,虽然我希望学习一种替代方法来批量复制 android 类,因为这相当于更改 performFiltering 方法中的两个方法名称。至少你让我对自己阅读和理解代码有信心,这当然是值得的。谢谢。
猜你喜欢
  • 2011-01-13
  • 1970-01-01
  • 2014-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-21
  • 1970-01-01
  • 2015-05-23
相关资源
最近更新 更多