У меня есть пользовательский listView
(который я буду заполнять из firebase), по которому я хочу реализовать поиск. Моя реализация с классом Filter
уже работает ... вроде. Но не очень крепкий. Пример: он не обрабатывает орфографическую ошибку (нет нечеткости), и важен порядок слова.
Пример: в просмотре списка у меня есть: hello world
Если я ищу world
, hello world
отображается правильно. Тем не менее, world hello
не соответствует элементу listview
.
Так что мне нужна моя фильтрация для обработки орфографических ошибок и для того, чтобы порядок слов не имел значения. Это мой текущий код фильтрации:
class SearchFiltering extends Filter {
@Override
protected FilterResults performFiltering(CharSequence charSequence) {
FilterResults results = new FilterResults();
if (charSequence != null && charSequence.length() > 0) {
charSequence = charSequence.toString().toUpperCase().trim();
ArrayList<SearchItems> filtered = new ArrayList<>();
for (int i = 0; i < filteredItems.size(); i++) {
String cleanedItem = filteredItems.get(i).getName().toUpperCase();
if (cleanedItem.contains(charSequence)){
filtered.add(filteredItem.get(i));
}
}
results.count = filtered.size();
results.values = filtered;
} else {
results.count = filteredItem.size();
results.values = filteredItem;
}
return results;
}
Я знаю, что проблема здесь в .contains()
, что недостаточно для моих намерений. Поскольку я новичок в этом, я не знаю каких-либо функций / библиотек, которые могут обрабатывать нечеткость. Я также хотел бы знать о хорошем подходе сделать последовательности слов не относящимися к фильтру.
Я пытался удалить пробелы из последовательности поиска и строки представления списка, но порядок символов все еще важен.
некоторые другие предложения включают использование Apache Lucene или MySQLlite, которые, я думаю, не нужны для этой области.
мой список содержит список адресов, которые станут достаточно большими, но не настолько большими, что я не смогу загрузить все данные из базы данных и выполнить поиск локально.
Лучше ли запрашиватьбазы данных в Firebase напрямую (в режиме реального времени) и фильтровать результаты таким образом, прежде чем заполнить listView? Я думаю, что этот подход будет довольно медленным.