Вызов RxJava Single In Kotlin Lambda

Я пытаюсь возиться с новой библиотекой Room, соединяя ее с RxJava.

Я нашел способ использовать Single для вставки элементов в фоновый поток, как это, внутри действия:

 Single.fromCallable { AppDatabase.getInMemoryDatabase(this).taskDao().insertAll(task) } .subscribeOn(Schedulers.newThread()) .subscribe() 

Теперь у меня есть RecyclerView с задачами, у которых есть флажок, который вы можете использовать, чтобы пометить элемент как полный или нет. Я хочу обновить элемент каждый раз, когда он будет установлен / не установлен. Я вставлю весь ViewHolder для завершения, но обратите внимание, в частности, на lambda в bindTask() :

 inner class TaskViewHolder(view: View?) : RecyclerView.ViewHolder(view) { val descriptionTextView = view?.findViewById(R.id.task_description) as? TextView val completedCheckBox = view?.findViewById(R.id.task_completed) as? CheckBox fun bindTask(task: Task) { descriptionTextView?.text = task.description completedCheckBox?.isChecked = task.completed completedCheckBox?.setOnCheckedChangeListener { _, isChecked -> tasks[adapterPosition].completed = isChecked Single.fromCallable { itemView.context.taskDao().update(tasks[adapterPosition]) } .subscribeOn(Schedulers.newThread()) .subscribe() } } } 

Это работает для первого элемента, который я проверяю, но после этого я не могу щелкнуть любые другие флажки. Я думал, что Single разрушит себя, но, возможно, я не смогу сделать это внутри лямбды? Мне нужно каким-то образом вытащить Одиночку за ее пределы?

Я бы создал Observable с помощью Observable.create , сохранил этот эмиттер, используя лямбда, и передал следующие элементы внутри setOnCheckedChangeListener используя emitter.onNext()

 class TaskViewHolder(view: View) : RecyclerView.ViewHolder(view) { private lateinit var emitter: ObservableEmitter<Task> private val disposable: Disposable = Observable.create(ObservableOnSubscribe<Task> { e -> emitter = e }) .subscribeOn(Schedulers.newThread()) .observeOn(Schedulers.newThread()) .subscribe({ itemView.context.taskDao().update(it) }) val descriptionTextView = view?.findViewById(R.id.task_description) as? TextView val completedCheckBox = view?.findViewById(R.id.task_completed) as? CheckBox fun bindTask(task: Task) { descriptionTextView?.text = task.description completedCheckBox?.isChecked = task.completed completedCheckBox?.setOnCheckedChangeListener { _, isChecked -> tasks[adapterPosition].completed = isChecked emitter.onNext(tasks[adapterPosition]) } } } 

Я не тестировал его, но это должно работать

 class TaskViewHolder(view: View?) : RecyclerView.ViewHolder(view) { val descriptionTextView: TextView? = null val completedCheckBox: CheckBox? = null fun bindTask(task: Task) { descriptionTextView?.text = task.description completedCheckBox?.isChecked = task.completed completedCheckBox?.setOnCheckedChangeListener { _, isChecked -> tasks[adapterPosition].completed = isChecked itemView.context.taskDao().update(tasks[adapterPosition]) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe({ changeCount -> Timber.i("%,d item(s) updated", changeCount) }, { error -> Timber.e(error, "update failed") }) } } } interface TaskDao { fun update(task: Task): Flowable<Int> } 

Вместо создания нового Single я использую функциональность RchJava или комнату