【发布时间】:2019-10-25 21:06:46
【问题描述】:
我在我的应用程序中实现了一种搜索机制,这样当我搜索姓名或电子邮件时,它会显示带有匹配字符的字符串。但是,我的列表中有一些重音字符串,当我使用与该特定重音相关的常规字符进行搜索时,假设我有字符串“àngela”并且我搜索“angela”,除非我使用确切的字符串搜索,否则它不会显示字符串“安吉拉”。
无论口音与否,我都试图让它工作,比如如果我输入 "à" ,它应该显示所有包含 "à" 和 "a" 的字符串,反之亦然。知道该怎么做吗?我在网上查了一堆文章,例如:How to ignore accent in SQLite query (Android)" 并尝试了 normalizer,但它部分有效,如果我搜索“a”,它确实会显示带有普通字母的重音字母,但如果我搜索重音字母,它没有显示任何内容。
这是我的过滤器代码:
@Override
public Filter getFilter() {
return new Filter() {
@Override
protected FilterResults performFiltering(CharSequence charSequence) {
String charString = charSequence.toString();
if (charString.isEmpty()) {
mSearchGuestListResponseListFiltered = mSearchGuestListResponseList;
} else {
List<RegisterGuestList.Guest> filteredList = new ArrayList<>();
for (RegisterGuestList.Guest row : mSearchGuestListResponseList) {
// name match condition. this might differ depending on your requirement
// here we are looking for name or phone number match
String firstName = row.getGuestFirstName().toLowerCase();
String lastName = row.getGuestLastName().toLowerCase();
String name = firstName + " " +lastName;
String email = row.getGuestEmail().toLowerCase();
if ( name.trim().contains(charString.toLowerCase().trim()) ||
email.trim().contains(charString.toLowerCase().trim())){
filteredList.add(row);
searchText = charString.toLowerCase();
}
}
mSearchGuestListResponseListFiltered = filteredList;
}
FilterResults filterResults = new FilterResults();
filterResults.values = mSearchGuestListResponseListFiltered;
return filterResults;
}
@Override
protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
mSearchGuestListResponseListFiltered = (ArrayList<RegisterGuestList.Guest>) filterResults.values;
notifyDataSetChanged();
}
};
}
如果有人感兴趣,这是整个适配器类:https://pastebin.com/VxsWWMiS 这是相应的活动视图:
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
mSearchGuestListAdapter.getFilter().filter(query);
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
mSearchGuestListAdapter.getFilter().filter(newText);
mSearchGuestListAdapter.notifyDataSetChanged();
mSearchGuestListAdapter.setFilter(newText);
if(mSearchGuestListAdapter.getItemCount() == 0){
String sourceString = "No match found for <b>" + newText + "</b> ";
mNoMatchTextView.setText(Html.fromHtml(sourceString));
} else {
mEmptyRelativeLayout.setVisibility(View.GONE);
mRecyclerView.setVisibility(View.VISIBLE);
}
return false;
}
});
如有必要,很乐意分享任何细节。另外,我在搜索时随机得到了 indexoutofboundexception onBind() 方法(使用 recyclerview 作为列表):
java.lang.IndexOutOfBoundsException: Index: 7, Size: 0
at java.util.ArrayList.get(ArrayList.java:437)
知道该怎么做吗?
【问题讨论】:
标签: java android android-layout android-recyclerview android-search