Recycler View Using kotlin with cell click listener

Aayush Puranik
3 min readApr 12, 2020

In my previous article I have shown a demo for recycler view by implementing simple recycler view, recycler view with card based layout and horizontal recycler view to refer recycler view implementation please refer this article (https://medium.com/@aayushpuranik/recycler-view-using-kotlin-and-xml-afc8dc465bf9). If you want to refer recycler view using java then refer this (https://medium.com/@aayushpuranik/implementing-recyclerview-in-android-83603561e151 ).

In this article I will show my way of implementing a click listener for cell in recycler view using interface.
1. Click listener without data
2. Click listener with data

1. Click listener without data

interface CellClickListener {
fun onCellClickListener()
}

Implement this interface in activity or fragment wherever you wish to pass control. In this example this interface is implemented in MainActivity. Pass the reference of activity or fragment that implements CellClickListener to adapter like the line highlighted below is passing reference of activity in Adapter.

class MainActivity : AppCompatActivity(), CellClickListener {

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)

val recyclerView: RecyclerView = findViewById(R.id.recycler_view)
recyclerView.layoutManager = LinearLayoutManager(this)
recyclerView.adapter = Adapter(this, fetchList(), this)
}

private fun fetchList(): ArrayList<Model> {
val list = arrayListOf<Model>()

for (i in 0..9) {
val model = Model(R.drawable.ic_collections_black_24dp, "Title : $i", "Subtitle : $i")
list.add(model)
}
return list
}

override fun onCellClickListener() {
Toast.makeText(this,"Cell clicked", Toast.LENGTH_SHORT).show()
}
}

The adapter creates view for cell so we can set OnClickListener for cell view and using reference of cellClickListener which we have received from main activity can be used to call onCellClickListener of interface which is implemented in main activity. Check Adapter implementation

class Adapter(private val context: Context,
private val list: ArrayList<Model>,
private val cellClickListener: CellClickListener
) : RecyclerView.Adapter<Adapter.ViewHolder>() {

class ViewHolder(view: View): RecyclerView.ViewHolder(view) {
val iconIV: ImageView = view.findViewById(R.id.iconIV)
val titleTV: TextView = view.findViewById(R.id.titleTV)
val subtitleTV: TextView = view.findViewById(R.id.subtitleTV)
}

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val view = LayoutInflater.from(context).inflate(R.layout.row_view,parent, false)
return ViewHolder(view)
}

override fun getItemCount(): Int {
return list.count()
}

override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val data = list[position]
holder.iconIV.setImageDrawable(ContextCompat.getDrawable(context, data.icon))
holder.titleTV.text = data.title
holder.subtitleTV.text = data.subtitle

holder.itemView.setOnClickListener {
cellClickListener.onCellClickListener()
}
}
}

output: Check the highlighted text. Our logic is working but still it is not displaying the cell’s data for this case we need to pass data on cell click.

2. Click listener with data

Updated interface for click implementation

interface CellClickListener {
fun onCellClickListener(data: Model)
}

And update in Adapter is noting just 1 small change, keep the implementation same as before but pass the item of list on that position in onBindViewHolder.

val data = list[position]holder.itemView.setOnClickListener {
cellClickListener.onCellClickListener(data)
}

--

--