Como criar uma RecyclerView em Kotlin
Android Kotlin XML

Como criar uma RecyclerView em Kotlin



Neste tutorial de como criar uma RecyclerView em Kotlin vou descrever uma maneira simples de usa-la.

Primeiramente vamos criar um projeto vazio(Empty) no android studio.

Gradle

Logo após vamos inserir no nosso gradle no nível de app as seguintes linhas.

dependencies {
    ...
    implementation 'androidx.recyclerview:recyclerview:1.0.0'
}

Então devemos sincronizar nosso projeto para importar as bibliotecas necessárias como na imagem a seguir.

Como criar uma RecyclerView em Kotlin
Clicar no botão Sync Now para sincronizar.

Logo após inserir a biblioteca do recyclerview e sincronizar o recurso já deve estar disponível.

Como criar uma RecyclerView em Kotlin

Nesse momento antes de mais nada devemos criar uma estrutura com uma nova activity vazia com o nome de NameActivity e seu respectivo layout, também criar um layout com o nome de content_lista e um arquivo class de kotlin chamado ListaAdapter assim como mostra a imagem a seguir.

Como criar uma RecyclerView em Kotlin
Modelo de pastas e arquivos.

Depois que criar os arquivos da forma como exemplifiquei anteriormente vamos começar a programar.

Códigos

Então nesse momento vou colocar os códigos e seus respectivos arquivos.

activity_main

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:app="http://schemas.android.com/apk/res-auto"
   xmlns:tools="http://schemas.android.com/tools"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   tools:context=".MainActivity">
    <Button
       android:id="@+id/btnInsert"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:text="Inserir"
       app:layout_constraintTop_toTopOf="parent"/>
    <androidx.recyclerview.widget.RecyclerView
       android:id="@+id/recyclerview"
       android:layout_width="match_parent"
       android:layout_height="0dp"
       app:layout_constraintTop_toBottomOf="@+id/btnInsert"
       app:layout_constraintBottom_toBottomOf="parent"/>
</androidx.constraintlayout.widget.ConstraintLayout>

MainActivity

class MainActivity : AppCompatActivity() {

    var nameList = ArrayList<String>()

    // Iniciando a RecyclerView
    var listaAdapter: ListaAdapter? = null
    var linearLayoutManager: LinearLayoutManager? = null

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

        initView()

        btnInsert.setOnClickListener {
            val intent = Intent(this, NameActivity::class.java)
            startActivityForResult(intent,1)
        }
    }

    override fun onResume() {
        super.onResume()
        initView()
    }

    private fun initView(){
        listaAdapter = ListaAdapter(nameList,this)
        linearLayoutManager = LinearLayoutManager(this)
        recyclerview.layoutManager = linearLayoutManager
        recyclerview.adapter = listaAdapter
    }
    @SuppressLint("MissingSuperCall")
    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        if(requestCode == 1 && resultCode == Activity.RESULT_OK){
            val nome= data!!.getStringExtra("nome")
            nameList.add(nome)
        }
    }
}

activity_name

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:app="http://schemas.android.com/apk/res-auto"
   xmlns:tools="http://schemas.android.com/tools"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   tools:context=".NameActivity">
    <LinearLayout
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:orientation="vertical"
       android:layout_margin="16dp"
       app:layout_constraintTop_toTopOf="parent"
       app:layout_constraintBottom_toBottomOf="parent">
        <TextView
           android:layout_width="match_parent"
           android:layout_height="wrap_content"
           android:text="Digite o nome:"
           android:textSize="18sp"
           android:gravity="center"/>
        <EditText
           android:id="@+id/etNome"
           android:layout_width="match_parent"
           android:layout_height="wrap_content"/>
        <Button
           android:id="@+id/btnInsertNome"
           android:layout_width="match_parent"
           android:layout_height="wrap_content"
           android:text="Inserir"
           android:layout_marginTop="10dp"/>
        <Button
           android:id="@+id/btnCancel"
           android:layout_width="match_parent"
           android:layout_height="wrap_content"
           android:text="Cancelar"/>
    </LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

NameActivity

class NameActivity : AppCompatActivity() {

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

        btnInsertNome.setOnClickListener {
            if(etNome.text.toString() == ""){
                Toast.makeText(this,"Nome está vazio.",Toast.LENGTH_SHORT).show()
            }
            else {
                val resultIntent = this.intent
                resultIntent.putExtra("nome", etNome.text.toString())
                setResult(Activity.RESULT_OK,resultIntent)
                finish()
            }
        }
        btnCancel.setOnClickListener {
            finish()
        }
    }
}

content_lista

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
   xmlns:android="http://schemas.android.com/apk/res/android"
   android:orientation="vertical" android:layout_width="match_parent"
   android:layout_height="wrap_content"
   android:layout_marginStart="8dp"
   android:layout_marginEnd="8dp">
    <TextView
       android:id="@+id/tvAdpNome"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:text="Nome"
       android:textSize="18sp"
       android:textColor="#000000"
       android:padding="10dp"
       android:gravity="center"/>
</LinearLayout>

ListaAdapter

class ListaAdapter (nameList: List<String>, internal var ctx: Context): RecyclerView.Adapter<ListaAdapter.ViewHolder>() {

    internal var nameList: List<String> = ArrayList<String>()
    init {
        this.nameList = nameList
    }

    // Aqui é onde o viewholder é criado a partir do layout
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        val view = LayoutInflater.from(ctx).inflate(R.layout.content_lista, parent, false)
        return ViewHolder(view)
    }

    // Nessa parte é onde se modifica o item do viewholder
    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        val name = nameList[position]

        holder.name.text = name
        if(position % 2 == 0) holder.name.setBackgroundColor(Color.GRAY)
        else holder.name.setBackgroundColor(Color.WHITE)
    }

    // Devolve quantidade de itens do nameList
    override fun getItemCount(): Int {
        return nameList.size
    }

    // Aqui é a criação dos itens do viewholder
    inner class ViewHolder(view: View): RecyclerView.ViewHolder(view){
        var name: TextView = view.findViewById(R.id.tvAdpNome)
    }
}

Espero poder ter ajudado com esse tutorial.





Veja também Como adicionar política de privacidade no aplicativo

Rodrigo Leutz
Desenvolvedor Web e Android ( Kotlin e Java )
https://www.uware.com.br