Android RecyclerView onClickListeners Kotlin and RxJava example


First example reimplemented in Kotlin and using RxJava for cleaner interaction.

import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import rx.subjects.PublishSubject

public class SampleAdapter(private val items: Array<String>) : RecyclerView.Adapter<SampleAdapter.ViewHolder>() {

    // change to different subjects from rx.subjects to get different behavior
    // BehaviorSubject for example allows to receive last event on subscribe
    // PublishSubject sends events only after subscribing on the other hand which is desirable for clicks
    public val itemClickStream: PublishSubject<View> = PublishSubject.create()
    override fun getItemCount(): Int {
        return items.size

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder? {
        val v = LayoutInflater.from(parent.getContext()).inflate(R.layout.text_row_item, parent, false);
        return ViewHolder(view)

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {

    public inner class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
        private val textView: TextView by lazy { view.findViewById( as TextView }

        init {
            view.setOnClickListener { v -> itemClickStream.onNext(v) }

        fun bind(text: String) {
            textView.text = text

Usage is quite simple then. It's possible to subscribe on separate thread using RxJava facilities.

val adapter = SampleAdapter(arrayOf("Hello", "World"))
adapter.itemClickStream.subscribe { v ->
    if ( == {
        // do something