[英]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.