Skip to content

Instantly share code, notes, and snippets.

@webserveis
Last active October 19, 2023 21:36
Show Gist options
  • Save webserveis/d78b7ec6ba17ca025aa0570c63874319 to your computer and use it in GitHub Desktop.
Save webserveis/d78b7ec6ba17ca025aa0570c63874319 to your computer and use it in GitHub Desktop.
Implementar click RecyclerView Kotlin AndroidX

RecyclerView Kotlin onClickListener

Ejemplo de como integrar un recyclerview usando Kotlin, los elementos se mostrarán con filas simples y permite ser pulsados

Partiendo del trozo de código anterior (Recyclerview Kotlin I)[https://gist.github.com/webserveis/b66149f204c5946a8dd9107278486c63]

Añadir funcionalidad onClickListener

Para implementar onClickListener a los elementos que se visualizan en el recyclerView

val mAdapter = MySimpleAdapter(dummyData())
recycler_view.setHasFixedSize(true)
recycler_view.layoutManager = LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false)
recycler_view.adapter = mAdapter
mAdapter.setOnItemClickListener(object : MySimpleAdapter.ClickListener {
override fun onItemClick(v: View, position: Int) {
Log.v(TAG, "onItemClick ${position}")
Toast.makeText(
this@MainActivity,
"Clicked: ${mAdapter.getItem(position)}",
Toast.LENGTH_SHORT
).show()
}
})
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
class MySimpleAdapter(private val mDataSet: List<String>?) :
RecyclerView.Adapter<MySimpleAdapter.MyViewHolder>() {
private var clickListener: ClickListener? = null
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
val v = LayoutInflater.from(parent.context)
.inflate(R.layout.simple_list_item_1, parent, false)
return MyViewHolder(v)
}
override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
val data = mDataSet?.get(position)
data?.let { holder.bindItems(it) }
}
override fun getItemCount(): Int {
return mDataSet?.size ?: 0
}
fun getItem(position: Int): String? {
//return if (mDataSet != null) mDataSet[position] else null
return mDataSet?.get(position)
}
fun setOnItemClickListener(clickListener: ClickListener) {
this.clickListener = clickListener
}
inner class MyViewHolder(v: View) : RecyclerView.ViewHolder(v), View.OnClickListener {
private val text1 = v.findViewById(android.R.id.text1) as TextView
init {
if (clickListener != null) {
itemView.setOnClickListener(this)
}
}
fun bindItems(data: String) {
text1.text = data
}
override fun onClick(v: View?) {
if (v != null) {
clickListener?.onItemClick(v,adapterPosition)
}
}
}
interface ClickListener {
fun onItemClick(v: View,position: Int)
}
}
@ProfessorAdemilson
Copy link

Boa noite. Será que vc poderia me ajudar. Eu não consigo capturar o clique correto do meu recycler. Ele captura todo o recycler, e não o item específico.

segue o codigo. Obrigado

class AdapterAvisos(val listaDeAvisos: ArrayList, val onClickListener: OnClickListener) : RecyclerView.Adapter<AdapterAvisos.MH>(){

class OnClickListener(val clickListener: (aviso: AV) -> Unit){
    fun onClick(tipo: AV) = clickListener(tipo)
}

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

@SuppressLint("SuspiciousIndentation")
override fun onBindViewHolder(holder: MH, position: Int) {
val aviso = listaDeAvisos[position]
holder.tituloAviso.setText(aviso.titulo)
holder.autorAviso.setText(aviso.autor)
holder.mensagemAviso.setText(aviso.mensagem)
holder.dataAviso.setText(aviso.data)
holder.tipoAviso.setText(aviso.tipo)
//capturando o clique

                holder.tituloAviso.setOnClickListener {onClickListener.onClick(aviso)}
    }

    override fun getItemCount(): Int {
        return listaDeAvisos.size
    }

//View Holder
class MH(itemView: View) : RecyclerView.ViewHolder(itemView){
val tituloAviso: TextView = itemView.findViewById(R.id.txtTituloAvisoModelo)
val autorAviso: TextView = itemView.findViewById(R.id.txtAutorAvisoModelo)
val mensagemAviso: TextView = itemView.findViewById(R.id.txtMensagemAvisoModelo)
val dataAviso: TextView = itemView.findViewById(R.id.txtDataAvisoModelo)
val tipoAviso: TextView = itemView.findViewById(R.id.txtTipo)
}
}
eu quero que exiba o titulo do aviso quando o usuario clicar sobre um item do recycler.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment