I have implemented a search mechanism in my app, such that when I search for a name or email, it displays the string with the matching character. However, there are some accented strings in my list and when I search with a regular character pertaining to that specific accent, say if i have string "àngela" and I search "angela" it doesnt display the string unless i search with exact string " àngela".
I am trying to get it to work regardless of the accent or not, say if i type in "à" , it should show all strings containing " à" and "a" and vice versa. Any idea how to go about this? I looked up a bunch of articles online, for example: How to ignore accent in SQLite query (Android) " and tried normalizer too but it partially works, if i search "a", it does show the accented letters with regular letters aswell but if I search with accented letters, it doesnt show anything.
Here's my code for filter:
@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();
}
};
}
Here's the entire adapter class if anyone's interested : https://pastebin.com/VxsWWMiS Here's the corresponding activity view:
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;
}
});
Happy to share any details if necessary. Also, randomly I do get the indexoutofboundexception onBind() method while searching (use recyclerview for list):
java.lang.IndexOutOfBoundsException: Index: 7, Size: 0
at java.util.ArrayList.get(ArrayList.java:437)
Any idea how to go about this?