#kotlin #rx-java #searchview
Вопрос:
У меня есть такой код для поиска потоков по их названию.
compositeDisposable.add(Observable.create(ObservableOnSubscribelt;Stringgt; { subscriber -gt; binding.searchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener { override fun onQueryTextChange(newText: String?): Boolean { subscriber.onNext(newText!!) return false } override fun onQueryTextSubmit(query: String?): Boolean { subscriber.onNext(query!!) return false } }) }) .debounce(250, TimeUnit.MILLISECONDS) .distinct() .subscribe { text -gt; val pagerPos = binding.streamsPager.currentItem val currentFragment = activity?.supportFragmentManager?.findFragmentByTag("f${pagerAdapter.getItemId(pagerPos)}") (currentFragment as StreamFragment).onSearchHolder.onSearch(text) } )
Он отлично работает с onQueryTextSubmit, но игнорирует setOnQueryTextListener. Поэтому, когда я хочу стереть символы и «сбросить» поиск, я ничего не получаю
Как это исправить?
Комментарии:
1. Вы уверены, что хотите
distinct()
?distinct()
означает, что наблюдаемое никогда не будет излучать один и тот же элемент дважды. Может быть, вам нужноdistinctUntilChanged()
Ответ №1:
используйте класс-оболочку для вашей наблюдаемой подписки и запечатанный класс для событий поиска. Подобный этому:
class SearchViewWrapper(private val searchView: SearchView) : ObservableOnSubscribelt;SearchViewEventgt; { override fun subscribe(emitter: ObservableEmitterlt;SearchViewEventgt;) { searchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener { override fun onQueryTextSubmit(query: String?): Boolean { emitter.onNext(SearchViewEvent.onQueryTextSumbit(query)) return true } override fun onQueryTextChange(newText: String?): Boolean { emitter.onNext(SearchViewEvent.onQueryChanged(newText)) return true } }) } }
Закрытый класс для мероприятий:
sealed class SearchViewEvent { data class onQueryChanged(val text: String?): SearchViewEvent() data class onQueryTextSumbit(val query: String?): SearchViewEvent() }
Попробуйте использовать его там, где вам нужно(просто пример):
fun useIt(searchView: SearchView) { Observable.create(SearchViewWrapper(searchView)) .subscribe(::handleSearchViewEvent) .addTo(yourCompositeDisposable) } private fun handleSearchViewEvent(event: SearchViewEvent) { when (event) { is SearchViewEvent.onQueryChanged -gt; TODO() is SearchViewEvent.onQueryTextSumbit -gt; TODO() } }