如何过滤我的文本以便考虑空格?

时间:2018-03-27 15:43:55

标签: java android filter

我正在为我的应用创建一个搜索框,用户可以在框中输入内容,并在搜索框下方的recyclerView中返回标题。标题位于服务器上的php文件中 - 结果将被过滤,与用户在搜索框中输入的内容相匹配。

例如,我的php文件中的一个标题是:

red onions

如果用户输入redrecyclerView会在他输入时显示:

red cabbage
red mushrooms
red onions

这部分工作正常。

但是当用户输入red o时,recyclerView中没有显示任何内容。事实上,red onions应该出现。

我确定这种情况正在发生,因为在我的应用中,我将php标题分成单独的单词,因此(" ")red之间的空格onions导致了问题

我知道如何才能解决这个问题吗?

我首先将标题拆分为单词的原因是,如果用户输入第二个单词onionsred onions将在recyclerView中显示结果,而不是一无所获。

这是我的代码:

      @Override
            public Filter getFilter() {
                return new Filter() {
                    @Override
                    protected FilterResults performFiltering(CharSequence charSequence) {

                        //the text entered in the search box
                        String charString = charSequence.toString();

                        //if searchbox is empty, show the whole list
                        if (charString.isEmpty()) {
                            categoryListFiltered = categoryList;
                        } else {
                            List<Category> filteredList = new ArrayList<>();

                            for (Category row : categoryList) {

                                //split the php title into separate words
                                String[] title_in_php = row.getName().split(" ");

                                //for every split word
                                for (String split_title : title_in_php) {

//if the search term entered is a whole word in the title
                        if (split_title.toLowerCase().startsWith(charString.toLowerCase())) { 

                                        filteredList.add(row);

                                    }
                                }
                            }

                            categoryListFiltered = filteredList;
                        }

                        FilterResults filterResults = new FilterResults();

                        filterResults.values = categoryListFiltered;
                        return filterResults;
                    }

                    @Override
                    protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
                        categoryListFiltered = (ArrayList<Category>) filterResults.values;
                        notifyDataSetChanged();
                    }
                };
            }

1 个答案:

答案 0 :(得分:2)

输入red o后,它会首先检查red并将row添加到filteredList,因为charString以red开头,但检查o不会将row添加到filteredList,因为charString不以o

开头

试试这个(基于评论):

if (split_title.toLowerCase().startsWith(charString.toLowerCase())) {
    filteredList.add(row);
}
else if (row.getName().contains(charString.toLowerCase()) {
    if (!filteredList.contains(row)) {
        filteredList.add(row);
    }
}

if用于检查split_title(例如red) - filteredList.add(row);

else if会检查row是否包含charString(整个字符串 - 例如red o) - filteredList.add(row);

if (!filteredList.contains(row))只是检查该行是否已在列表中。如果没有,那么添加它。 (为避免重复)

另一种方法是拆分charString:

String[] charString= charSequence.toString().split(" ")

并迭代它:

for (int i=0; i<charString.length; i++) {
    for (int n=0; n<title_in_php.length; n++) {
        if (split_title.toLowerCase().startsWith(charString.toLowerCase()) || charString[i].toLowerCase() == title_in_php[n].toLowerCase() || row.getName().contains(charString.toLowerCase()) {
            if (!filteredList.contains(row)) {
                filteredList.add(row);
            }
        }
    }
}

因此如果charString = title_in_php charString ,它会检查title_in_php是否以row 开头{1}}包含charString检查title_in_phpcharString

列表

[red] [red / onion] OR [red] = [红/洋葱] [红洋葱] 包含 [red o]