如何根据 searchView 输入过滤字符串
How to filter string based on the searchView input
我想为我的 searchView 创建建议。
我有一个 listView 和一个包含整个联系人列表的地图。我创建了一个自定义适配器来填充 ListView。我还有一个 searchView 允许用户搜索特定联系人。
现在我正在使用 OnQueryTextChange,但我不知道如何创建另一个 Map 将其传递到适配器中以便仅显示用户键入的名称。
我卡住了,因为我只想根据首字母添加联系人姓名。示例:如果用户键入 "m",那么我想创建一个包含所有以 "m" 开头的联系人的地图,然后用户继续添加字母,地图应该过滤联系人,直到只有一个名字。
代码如下:
@Override
public boolean onQueryTextChange(String newText) {
for (String name : mKeys) { // here Im looping the keys of my contact Map
if (something) {
Map.put(name, contact.get(name)); // contact is the contact Map
}
createContactAdapter(Map);
}
}
return false;
}
感谢您的帮助
编辑
我更新的代码:
@Override
public boolean onQueryTextChange(String newText) {
Toast.makeText(ContactsActivity.this, newText, Toast.LENGTH_SHORT).show();
for (String name : mKeys) {
name = name.trim();
if (name.startsWith(newText) && newText.length() > 0) {
mFilteredMap.put(name, "00000000000"); // NPE here
if (mFilteredMap.size() > 1) {
createContactAdapter(mFilteredMap);
}
}
}
return false;
首先让我们只处理加法函数。
我想我现在明白了。是...
if (name.startsWith(newText))
你在找什么?
这将查看键是否以搜索中的文本开头;如果是,请将其添加到地图中。
在这一点上,您将拥有第一个字母的 所有 键的映射。如果您想过滤此地图,则必须进行 empty
检查以查看您正在使用哪组键。然后你必须删除所有条目...
if (! name.startsWith(newText)) { /* remove it */ }
这告诉您给定的键 与搜索不匹配 然后您将其删除。
您不必使用此地图,创建另一个地图,将其称为 filteredMap,每次用户键入内容时,您清除 filteredMap,迭代原始地图,并移动包含或以其开头的项目输入的文本,使用 filteredMap 创建适配器,
如上所述,使用 startWith 和 contains 仅移动正确的项目...
我想为我的 searchView 创建建议。
我有一个 listView 和一个包含整个联系人列表的地图。我创建了一个自定义适配器来填充 ListView。我还有一个 searchView 允许用户搜索特定联系人。
现在我正在使用 OnQueryTextChange,但我不知道如何创建另一个 Map 将其传递到适配器中以便仅显示用户键入的名称。
我卡住了,因为我只想根据首字母添加联系人姓名。示例:如果用户键入 "m",那么我想创建一个包含所有以 "m" 开头的联系人的地图,然后用户继续添加字母,地图应该过滤联系人,直到只有一个名字。
代码如下:
@Override
public boolean onQueryTextChange(String newText) {
for (String name : mKeys) { // here Im looping the keys of my contact Map
if (something) {
Map.put(name, contact.get(name)); // contact is the contact Map
}
createContactAdapter(Map);
}
}
return false;
}
感谢您的帮助
编辑
我更新的代码:
@Override
public boolean onQueryTextChange(String newText) {
Toast.makeText(ContactsActivity.this, newText, Toast.LENGTH_SHORT).show();
for (String name : mKeys) {
name = name.trim();
if (name.startsWith(newText) && newText.length() > 0) {
mFilteredMap.put(name, "00000000000"); // NPE here
if (mFilteredMap.size() > 1) {
createContactAdapter(mFilteredMap);
}
}
}
return false;
首先让我们只处理加法函数。
我想我现在明白了。是...
if (name.startsWith(newText))
你在找什么?
这将查看键是否以搜索中的文本开头;如果是,请将其添加到地图中。
在这一点上,您将拥有第一个字母的 所有 键的映射。如果您想过滤此地图,则必须进行 empty
检查以查看您正在使用哪组键。然后你必须删除所有条目...
if (! name.startsWith(newText)) { /* remove it */ }
这告诉您给定的键 与搜索不匹配 然后您将其删除。
您不必使用此地图,创建另一个地图,将其称为 filteredMap,每次用户键入内容时,您清除 filteredMap,迭代原始地图,并移动包含或以其开头的项目输入的文本,使用 filteredMap 创建适配器, 如上所述,使用 startWith 和 contains 仅移动正确的项目...