Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何根据searchView输入筛选字符串_Java_Android_Listview_Adapter_Searchview - Fatal编程技术网

Java 如何根据searchView输入筛选字符串

Java 如何根据searchView输入筛选字符串,java,android,listview,adapter,searchview,Java,Android,Listview,Adapter,Searchview,我想为我的searchView创建建议 我有一个列表视图和一个包含整个联系人列表的地图。我创建了一个自定义适配器来填充ListView。我还有一个searchView,允许用户搜索特定联系人 现在我使用的是OnQueryTextChange,但我不知道如何创建另一个映射将其传递到适配器中,以便只显示用户键入的名称 我被卡住了,因为我只想根据第一个字母添加联系人姓名。示例:如果用户键入“m”,那么我想创建一个所有联系人都以“m”开头的地图,然后用户继续添加字母,地图应该过滤联系人,直到只有一个姓名

我想为我的searchView创建建议

我有一个列表视图和一个包含整个联系人列表的地图。我创建了一个自定义适配器来填充ListView。我还有一个searchView,允许用户搜索特定联系人

现在我使用的是OnQueryTextChange,但我不知道如何创建另一个映射将其传递到适配器中,以便只显示用户键入的名称

我被卡住了,因为我只想根据第一个字母添加联系人姓名。示例:如果用户键入“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))

你在找什么

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

此时,您将拥有第一个字母的所有键的地图。如果要筛选此地图,必须进行
检查,以查看正在处理的密钥集。然后你必须删除所有带有

if(!name.startsWith(newText)){/*删除它*/}


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

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

您的设备面临哪些问题?当然需要更换if条件!当然不确定这是否像你想的那么明显。如果你没有If,你就用所有键/值填充列表吧?我的意思是:If(something)@Agostinellli-有帮助吗?是的,你帮了很多忙,但我还是有一些问题。我有一个NPE。我怎么能发布其他的代码呢?我想,或者更确切地说,那个OP是在谈论一个单独的地图。我认为这是暗示的帖子,因为他们有一个联系地图和另一个。在我创建了已经“精简的地图”之后,我也不会继续查询og。在没有适当护理的情况下,这可能是一种严重的资源浪费。您已经拥有了所关心的密钥子集。这肯定比不断地检查那些你知道已经合适的更有效。