Android SearchSuggestSelection позволяет начинать запрос вместо того, чтобы содержать поиск

StackOverflow https://stackoverflow.com//questions/11649194

  •  11-12-2019
  •  | 
  •  

Вопрос

Я использую Андроид ПоискRecentSuggestionsProvider и Конфигурация с возможностью поиска для отображения предыдущих результатов поиска в приложении и хотелось бы ограничить предлагаемые ответы, чтобы возвращать только записи, начинающиеся с ?(то, что пишет пользователь)

в настоящее время "p" возвращает телефон, iPod, фото, счастье, а мне нужен только телефон и фото

Что-то эквивалентное SQL, например%, но я не могу заставить это работать.

<searchable xmlns:android="http://schemas.android.com/apk/res/android"
    android:hint="@string/product_search_hint"
    android:imeOptions="actionSearch"
    android:label="@string/app_label"
    android:searchSuggestAuthority="com.myapp.ProductSearchSuggestionProvider"
    android:searchSuggestSelection="word MATCH ?" >
</searchable>

Пытался:

android:searchSuggestSelection="WORD LIKE '%'?"
Это было полезно?

Решение

Если бы вы реализовали полностью настраиваемый поставщик предложений, применение настроек на этом уровне работало бы так, как ожидалось.Однако под прикрытием SearchRecentSuggestionsProvider запрашивает свою локальную таблицу со следующими жестко закодированными аргументами (Взгляни):

  • выбор = "display1 НРАВИТСЯ?"
  • selectArgs = ["%{query}%"]

где {query} — поисковый запрос (он заключен между двумя знаками процента, так что учитывается любой символ, совпадающий в любом месте строки).Он игнорирует значение, переданное для строки выбора (которое вы устанавливаете с помощью searchSuggestSelection параметр) и массив args (кроме проверки того, пуст ли он), так что из XML мало что можно сделать.

Поскольку реализация игнорирует входящие параметры, простого исправления или переопределения не существует.Чтобы избежать дублирования кода, я бы:

  1. Скопируйте всю реализацию SearchRecentSuggestionsProvider по ссылке выше.Ничего из того, что делает класс, не должно быть закрытым для платформы, поэтому должна компилироваться прямая копия.
  2. Измените оператор построения из массива args внутри query() метод, быть String like = selectionArgs[0] + "%" вместо String like = "%" + selectionArgs[0] + "%" (т.е.удали первый процент)
  3. Подкласс ProductSearchSuggestionProvider вместо этого из вашей новой реализации.

Другие советы

Вы пробовали строковые конкатенации?

word LIKE ? || '%'
.

|| - строковое конконтрация в Sqlite.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top