【发布时间】:2012-11-02 11:55:24
【问题描述】:
我最近向this SO question 添加了一个赏金,但意识到最初的问题要求的是 SimpleAdapter 而不是 ArrayAdapter。所以,这个问题与 ArrayAdapter 有关:
我希望能够使用多个搜索词过滤 ListView 中的 ArrayAdapter。例如,如果我的列表包含以下项目:
a thing
another thing
a different thing
nothing
some thing
如果我搜索“事物”,则 所有 项应在过滤结果中返回。这是可以使用以下代码完成的正常行为:
private TextWatcher filterTextWatcher = new TextWatcher() {
public void onTextChanged(CharSequence s, int start, int before, int count) {
// TODO Auto-generated method stub
}
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
// TODO Auto-generated method stub
}
public void afterTextChanged(Editable s) {
// TODO Auto-generated method stub
myAdapter.getFilter().filter(s.toString());
}
};
但是;如果我输入搜索短语“a thing”,我希望会显示以下结果:
a thing
another thing
a different thing
事实上,我在结果“a thing”中得到了返回。由于过滤器正在查找整个字符串,因此它将空格视为搜索词的一部分。本质上,我要问的是如何过滤列表,而不是按一个特定的字符串,而是按多个搜索词,每个搜索词用空格分隔?只要每个搜索词在项目中至少出现一次,那么该项目就应该在结果中返回。
以前似乎在 SO 上提出过类似的问题(例如,请参阅本文顶部的链接,该链接涉及 SimpleAdapters),但我没有找到实现此目的的实际方法。我想答案将涉及将搜索短语分成单独的字符串,由空格字符分隔,然后在每个字符串上多次运行搜索,并且只返回与 all 的迭代匹配的结果...
【问题讨论】:
-
为什么我会有那种可怕的“我错过了什么”的感觉?您能否不扩展适配器,然后覆盖 getFilter() 方法,创建自己的过滤器,覆盖 performFiltering() 并使用正则表达式返回任何集合,例如ArrayList,你需要吗?
-
我会在这里留下我的评论,以防有人犯了和我一样的错误,错过了你不想扩展适配器的点。嗬!对不起!
-
嗯,这不能在不扩展 ArrayAdapter 的情况下完成,因为没有更改过滤器的接口。为什么不想编写自定义适配器?
-
不不,我扩展适配器没有问题!我根本没有在我的问题中规定这一点......欢迎任何可能的解决方案:)
标签: android listview filtering android-arrayadapter