Сбросить слушателя с кнопки RxJava

Пробую первый день писать с использованием RxJava. Весь день не могу понять, как удалить слушатель с кнопки. ClickEvent у меня это просто object пустой, хочу научиться ловить клик.

val button: Button = findViewById(R.id.button)

val observable: Observable<ClickEvent> = Observable.create<ClickEvent> { emitter ->

    val listener = View.OnClickListener {
        object : View.OnClickListener {
            override fun onClick(v: View?) {
                emitter.onNext(ClickEvent)
            }
        }
    }
   button.setOnClickListener(listener)
   emitter.setDisposable(Disposables.fromAction {
      button. // сбросить слушатель
   })

}

Ответы (1 шт):

Автор решения: ЮрийСПб

Чтобы сбросить слушатель нажатий надо в метод установки оного передать null

button.setOnClickListener(null)


Также есть уже библиотека, в которой всё это (и многое другое) реализовано: RxBinding

В её исходниках аналогичный код выглядит так:

@CheckResult
fun View.clicks(): Observable<Unit> {
  return ViewClickObservable(this)
}

private class ViewClickObservable(
  private val view: View
) : Observable<Unit>() {

  override fun subscribeActual(observer: Observer<in Unit>) {
    if (!checkMainThread(observer)) {
      return
    }
    val listener = Listener(view, observer)
    observer.onSubscribe(listener)
    view.setOnClickListener(listener)
  }

  private class Listener(
    private val view: View,
    private val observer: Observer<in Unit>
  ) : MainThreadDisposable(), OnClickListener {

    override fun onClick(v: View) {
      if (!isDisposed) {
        observer.onNext(Unit)
      }
    }

    override fun onDispose() {
      view.setOnClickListener(null)
    }
  }
}
→ Ссылка