Algolia Android - Пустой запрос не отфильтрован - PullRequest
0 голосов
/ 16 января 2020

Я пытаюсь настроить окно поиска так, чтобы оно не возвращало результаты поиска, когда запрос пуст - т.е. когда в поле ничего не было напечатано. По умолчанию 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
    }
}
...