[英]How do I filter my text so that spaces are taken into account?
我正在为我的应用程序创建一个搜索框,用户可以在其中输入内容,标题将在搜索框下方的recyclerView
中返回。 标题在服务器上的php
文件中-过滤结果,匹配用户在搜索框中输入的内容。
因此,例如,我的php
文件中的标题之一是:
red onions
如果用户键入red
,那么他输入时将显示recyclerView
:
red cabbage
red mushrooms
red onions
这部分工作正常。
但是,当用户键入red o
时, recyclerView
中将不会显示任何内容。 实际上,应该出现red onions
。
我敢肯定这是因为我的应用程序中将php标题分解为单独的单词,所以red
和onions
之间的空格(" ")
引起了问题。
知道我该如何解决吗?
我首先将标题拆分为单词的原因是,如果用户键入第二个单词onions
,结果将在recyclerView
显示red onions
,而不是什么都没有。
这是我的代码:
@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();
}
};
}
一旦你进入red o
,它会首先检查red
,它会添加row
,因为与charstring类型开始filteredList 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
) charString
(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
包含charString
检查的列表title_in_php
每charString
[红色]以[红色/洋葱 ]开头或 [红色] = [红色/洋葱] 或 [红色洋葱]包含[红色o]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.