JakeWharton / RxBinding

RxJava binding APIs for Android's UI widgets.
Apache License 2.0
9.69k stars 971 forks source link

RxBinding Clicks() does not trigger onComplete() #501

Closed geoffreylzf closed 5 years ago

geoffreylzf commented 5 years ago

Hi guys, I faced some problem when implement rxbinding into my recycleview code.

private val clickSubject = PublishSubject.create<Company>()    
val clickEvent: Observable<Company> = clickSubject
override fun onBindViewHolder(holder: CompanyViewHolder, position: Int) {
        companyList[position].let { company ->
            holder.itemView.run {
                li_tv_company_code.text = company.companyCode
                li_tv_company_name.text = company.companyName
                setOnClickListener {
                    clickSubject.onNext(companyList[position])
                    clickSubject.onComplete()
                }
            }
        }
    }

The above code executed properly and my Observable on fragment is able to trigger onNext() and onCompleted()

After I implemented RxBinding

override fun onBindViewHolder(holder: CompanyViewHolder, position: Int) {
        companyList[position].let { company ->
            holder.itemView.apply {
                clicks().map { companyList[position] }.subscribe(clickSubject)
            }.run {
                li_tv_company_code.text = company.companyCode
                li_tv_company_name.text = company.companyName
            }
        }
    }

The above code executed properly, but my Observable on fragment is only able to trigger onNext() and onComplete() is ignore

Thank for any advice in advance.

JakeWharton commented 5 years ago

Listener streams created by the library are infinite. If you only want a single item before an "on complete" event, add a take(1) operator.