Я работаю над приложением Android, написанным в Scala, которое использует android.support.v7.widget.SearchView
внутри панели действий, которая переопределяется android.support.v7.widget.Toolbar
.
В приложении мне нужно включить поисковые подсказки для этого SearchView
. Поэтому каждый раз, когда я обнаруживаю изменение запроса, я проверяю, нужно ли обновлять предложения (код ниже). Если необходимо обновить предложения, вызов будет выполняться на бэкэнд и создается android.database.MatrixCursor
, в котором содержатся предложения по поиску, и устанавливается в адаптере предложений SearchView
(код ниже).
Проблема, с которой я сталкиваюсь, заключается в том, что подсказки поиска не будут отображаться при вводе символа одиночного. Ввод двух или более символов в поле поиска работает отлично.
Я попытался с android:searchSuggestThreshold
установить в 0
и 1
в моей конфигурации XML, и я получаю тот же результат (например, этот параметр игнорируется): подсказки поиска, отображаемые для нескольких входных символов, но не отображающиеся для один символ.
Я что-то пропустил в конфигурации/инициализации SearchView
? Как вариант, отличный от android:searchSuggestThreshold
, который я могу установить? Я потратил последние несколько часов на поиск альтернативных вариантов, но не смог найти.
Возможное решение, которое я вижу, будет получать AutoCompleteTextView
, поддерживая вход SearchView
и устанавливая для него пороговое значение 1, но это уродливое (хакерское) решение, поскольку AutoCompleteTextView
не отображается API SearchView
.
Кто-нибудь знает элегантное решение для этого?
Спасибо!
Обнаружение изменений поискового запроса:
//this gets called whenever something is changed in the search box. "s" contains the entire search term typed in the search box
def onQueryTextChange(s: String): Boolean = {
//this checks to see if a call should be made to the backend to update suggestions
SearchSuggestionController.query(s)
//return false as we're not consuming the event
false
}
Обновление предложений по поиску:
def updateSuggestions(suggestions: Array[String]): Unit = {
val cursor = new MatrixCursor(Array(BaseColumns._ID, SearchManager.SUGGEST_COLUMN_TEXT_1), suggestions.length)
for{
i <- suggestions.indices
s = suggestions(i)
} cursor.addRow(Array[AnyRef](i.toString, s))
getActivity.runOnUiThread(() => {
searchSuggestionAdapter.changeCursor(cursor)
searchSuggestionAdapter.notifyDataSetChanged()
})
}
Инициализация меню SearchView:
override def onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) = {
inflater.inflate(R.menu.menu_products, menu)
val searchManager = getActivity.getSystemService(Context.SEARCH_SERVICE).asInstanceOf[SearchManager]
val actionItem = menu.findItem(R.id.action_search)
searchView = MenuItemCompat.getActionView(actionItem).asInstanceOf[SearchView]
searchView.setSearchableInfo(searchManager.getSearchableInfo(getActivity.getComponentName))
searchView.setSubmitButtonEnabled(false)
SearchSuggestionController.onSuggestionsProvided_=(updateSuggestions)
searchView setSuggestionsAdapter searchSuggestionAdapter
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
//...
//change listener for detecting search changes presented above
//...
}
//...
//initialise other components
//...
}
Конфигурация для поиска:
<?xml version="1.0" encoding="utf-8"?>
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
android:label="@string/app_name"
android:hint="@string/actionbar_products_search_hint"
android:searchSuggestThreshold="0"
android:searchSuggestSelection=" ?"/>