【问题标题】:Android SearchView onQueryTextChange doesn't work with ObservableOnSubscribeAndroid SearchView onQueryTextChange 不适用于 ObservableOnSubscribe
【发布时间】:2021-11-11 08:50:13
【问题描述】:

我有这样的代码,用于按名称搜索流。

    compositeDisposable.add(Observable.create(ObservableOnSubscribe<String> { subscriber ->
        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 ->
            val pagerPos = binding.streamsPager.currentItem
            val currentFragment =
                activity?.supportFragmentManager?.findFragmentByTag("f${pagerAdapter.getItemId(pagerPos)}")
            (currentFragment as StreamFragment).onSearchHolder.onSearch(text)
        }
    )

它适用于 onQueryTextSubmit,但忽略 setOnQueryTextListener。因此,当我想删除符号并“重置”搜索时,我什么也得不到

如何解决这个问题?

【问题讨论】:

  • 您确定要distinct()吗? distinct() 意味着 observable 永远不会发出相同的项目两次。也许你需要distinctUntilChanged()

标签: kotlin rx-java searchview


【解决方案1】:

为您的 ObservableOnSubscribe 使用包装类,为您的搜索事件使用密封类。像这样:

class SearchViewWrapper(private val searchView: SearchView) : ObservableOnSubscribe<SearchViewEvent> {

    override fun subscribe(emitter: ObservableEmitter<SearchViewEvent>) {
        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 -> TODO()
        is SearchViewEvent.onQueryTextSumbit -> TODO()
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-14
    • 1970-01-01
    • 2014-06-25
    • 1970-01-01
    • 1970-01-01
    • 2020-12-16
    相关资源
    最近更新 更多