我正在为我的应用创建一个搜索框,用户可以在框中输入内容,并在搜索框下方的recyclerView
中返回标题。标题位于服务器上的php
文件中 - 结果将被过滤,与用户在搜索框中输入的内容相匹配。
例如,我的php
文件中的一个标题是:
red onions
如果用户输入red
,recyclerView
会在他输入时显示:
red cabbage
red mushrooms
red onions
这部分工作正常。
但是当用户输入red o
时,recyclerView
中没有显示任何内容。事实上,red onions
应该出现。
我确定这种情况正在发生,因为在我的应用中,我将php标题分成单独的单词,因此(" ")
和red
之间的空格onions
导致了问题
我知道如何才能解决这个问题吗?
我首先将标题拆分为单词的原因是,如果用户输入第二个单词onions
,red 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();
}
};
}
答案 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_php
每charString
[red] 以 [red / onion] OR [red] = [红/洋葱] 或 [红洋葱] 包含 [red o]