如何根据 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))

你在找什么?

String.startsWith()

这将查看键是否以搜索中的文本开头;如果是,请将其添加到地图中。

在这一点上,您将拥有第一个字母的 所有 键的映射。如果您想过滤此地图,则必须进行 empty 检查以查看您正在使用哪组键。然后你必须删除所有条目...

if (! name.startsWith(newText)) { /* remove it */ }

这告诉您给定的键 与搜索不匹配 然后您将其删除。

您不必使用此地图,创建另一个地图,将其称为 filteredMap,每次用户键入内容时,您清除 filteredMap,迭代原始地图,并移动包含或以其开头的项目输入的文本,使用 filteredMap 创建适配器, 如上所述,使用 startWith 和 contains 仅移动正确的项目...