Итак, я фильтрую RecylerView, используя следующий код. Работает нормально. Я доволен тем, как он реагирует.
@Override
public Filter getFilter() {
return new Filter() {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults filterResults = new FilterResults();
List<TrailsObject> list_queryResults =new ArrayList<>();
String charString = (constraint ==null) ? "" : constraint.toString();
if (charString.isEmpty()) {
list_queryResults = list_main;
}else{
for (TrailsObject trailsObject : list_main) {
if (trailsObject.getName().toLowerCase().contains(charString)
|| trailsObject.getSummary().toLowerCase().contains(charString)
|| trailsObject.getType().toLowerCase().contains(charString)
|| trailsObject.getLocation().toLowerCase().contains(charString)
)
list_queryResults.add(trailsObject);
}
}
filterResults.values = list_queryResults;
return filterResults;
}
@Override
protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
listFiltered_main = (List<TrailsObject>) filterResults.values;
notifyDataSetChanged();
}
};
}
Если поле мошенника (Name
, Summary
, Type
, Location
) равно нулю, toLowerCase()
выбросит NPE
. Это еще не произошло, но кажется возможным. У меня нет контроля над этой базой данных.
Каков мой лучший способ решения этой проблемы? Я мог бы сделать нулевую проверку для каждого поля каждую итерацию (кажется дорогим). Интересно, могу ли я как-нибудь добавить блок try catch вокруг for loop
. Я действительно открыт для предложений.