Я пытаюсь настроить окно поиска так, чтобы оно не возвращало результаты поиска, когда запрос пуст - т.е. когда в поле ничего не было напечатано. По умолчанию Algolia InstantSearch возвращает все записи для прокрутки, которые затем фильтруются по запросу пользователя.
Я следовал документации API на веб-сайте Aloglia для , удаляя пустой запрос , но мое поле поиска по-прежнему возвращает все записи. Я немного застрял, поскольку кажется, что это очень простой класс, но использование SearchBoxView по умолчанию и моей исправленной версии NoEmptySearchBox не имеет значения в результатах.
Вот GroupFragment
, где я вызываю SearchBoxView
:
class GroupFragment : Fragment() {
private val connection = ConnectionHandler()
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
return inflater.inflate(R.layout.group_fragment, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val viewModel = ViewModelProviders.of(requireActivity())[SearcherViewModel::class.java]
val searchBoxView = NoEmptySearchBox(searchView)
viewModel.groups.observe(this, Observer { hits -> viewModel.adapterProduct.submitList(hits) })
connection += viewModel.searchBox.connectView(searchBoxView)
groupList.let {
it.itemAnimator = null
it.adapter = viewModel.adapterProduct
it.layoutManager = LinearLayoutManager(requireContext())
it.autoScrollToStart(viewModel.adapterProduct)
}
}
override fun onDestroyView() {
super.onDestroyView()
connection.disconnect()
}
}
А вот мой класс NoEmptySearchBox
, который реализует SearchBoxView
:
class NoEmptySearchBox (
val searchView: SearchView
) : SearchBoxView {
override var onQueryChanged: Callback<String?>? = null
override var onQuerySubmitted: Callback<String?>? = null
init {
searchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener {
override fun onQueryTextSubmit(query: String?): Boolean {
query?.isNotEmpty()?.let { onQuerySubmitted?.invoke(query) }
return false
}
override fun onQueryTextChange(query: String?): Boolean {
query?.isNotEmpty()?.let { onQuerySubmitted?.invoke(query) }
return false
}
})
}
override fun setText(text: String?, submitQuery: Boolean) {
searchView.setQuery(text, false)
}
}
А вот мой SearcherViewModel
:
class SearcherViewModel : ViewModel() {
val client = ClientSearch(ApplicationID("APP_ID"), APIKey("API_KEY"), LogLevel.ALL)
val index = client.initIndex(IndexName("groups"))
val searcher = SearcherSingleIndex(index)
override fun onCleared() {
super.onCleared()
searcher.cancel()
connection.disconnect()
}
val dataSourceFactory = SearcherSingleIndexDataSource.Factory(searcher) { hit ->
Group(
hit.json.getPrimitive("course_name").content,
hit.json.getObjectOrNull("_highlightResult")
)
}
val pagedListConfig = PagedList.Config.Builder().setPageSize(50).build()
val groups: LiveData<PagedList<Group>> = LivePagedListBuilder(dataSourceFactory, pagedListConfig).build()
val adapterProduct = GroupAdapter()
val searchBox = SearchBoxConnectorPagedList(searcher, listOf(groups))
val connection = ConnectionHandler()
init {
connection += searchBox
}
}