Android SearchView onQueryTextChange не работает с наблюдаемой подпиской

#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()  } }