Entrada destacada

Como usar enums en Android, kotlin


Los enums son muy útiles cuando se tienen conjuntos de contantes que tiene un objetivo parecido, nos sirven para evitar demasiados valores mágicos y tener mejor definido el significado de las constantes de nuestro proyecto. Veamos un ejemplo práctico, en el que usamos una clase enum para definir los status de una lista de usuarios, el enum nos ayudara a definir el código numérico de status, el texto que visualizará el usuario del status y un color especifico correspondiente.

¡Comencemos!

1. Crear un proyecto nuevo vació en Android Studio.
2. Agregar las siguientes dependencias al build.gradle (Module:app).
dependencies {

      //...
      implementation 'androidx.recyclerview:recyclerview:1.1.0'
      implementation 'androidx.cardview:cardview:1.0.0'
}
  
3. Para poder mostrar una lista de usuarios personalizada usaremos RecycleView. Agregamos el siguiente código xml al layout activity_main.xml.
    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/usersList"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_constraintTop_toTopOf="parent" />

El archivo activity_main debe quedar de la siguiente forma: 

<?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">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/usersList"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="8dp"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

4. Después creamos un layout para personalizar los items de la lista.

    <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">

    <androidx.cardview.widget.CardView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:elevation="4dp"
        app:cardUseCompatPadding="true">

        <androidx.constraintlayout.widget.ConstraintLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:padding="8dp">

            <TextView
                android:id="@+id/txtName"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginStart="10dp"
                android:textSize="18sp"
                android:textStyle="bold"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toTopOf="parent" />

            <TextView
                android:id="@+id/txtMail"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginStart="10dp"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toBottomOf="@id/txtName" />

            <TextView
                android:id="@+id/txtStatus"
                android:layout_width="80dp"
                android:layout_height="wrap_content"
                android:layout_marginEnd="10dp"
                android:background="@color/colorPrimary"
                android:paddingStart="10dp"
                android:paddingTop="5dp"
                android:paddingEnd="10dp"
                android:paddingBottom="5dp"
                android:textAlignment="center"
                android:textColor="#FFF"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintEnd_toEndOf="parent" />
        </androidx.constraintlayout.widget.ConstraintLayout>
    </androidx.cardview.widget.CardView>

</LinearLayout>

5. Ahora creamos la clase enum UserSatus, en la cual definiremos un listado de estados de registro para un usuario. Para este ejemplo usamos los siguientes (activo, pendiente, inactivo y eliminado).

import android.graphics.Color

enum class UserStatus(val code: Int, val text: String, val color: Int) {

    ACTIVE(1, "Active", Color.parseColor("#1AAD5C")),
    PENDING(2, "Pending", Color.parseColor("#E0C955")),
    INACTIVE(3, "Inactive", Color.parseColor("#767B7E")),
    REMOVED(4, "Removed", Color.parseColor("#E41C1B"));

}

6. Crear una clase modelo para representar a un usuario de cada fila de la lista. También agregamos a está clase un método para rellenar una lista de usuarios y que posteriormente pueda visualizarse en pantalla.

class User(
    val name: String,
    val mail: String,
    val status: UserStatus
) {
    companion object {
        fun getUsers(): ArrayList<User> {
            val usersList = ArrayList<User>()
            usersList.add(User("Tanisha Hickman", "user1@mail.com", UserStatus.ACTIVE))
            usersList.add(User("Ella Jarvis", "user2@mail.com", UserStatus.INACTIVE))
            usersList.add(User("Maggie Ortega", "user3@mail.com", UserStatus.ACTIVE))
            usersList.add(User("Jay Lara", "user4@mail.com", UserStatus.REMOVED))
            usersList.add(User("Joanna Cortez", "user5@mail.com", UserStatus.REMOVED))
            usersList.add(User("Martha Acosta", "user6@mail.com", UserStatus.PENDING))
            return usersList
        }
    }
}

7. Para poder unir la lista de usuarios con el RecyclerView se tiene que crear una adaptador personalizados que soporte el modelo User.

>import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import java.text.SimpleDateFormat
import java.util.*
import kotlin.collections.ArrayList

class UsersAdapter(private val usersList: ArrayList<User>) :
    RecyclerView.Adapter<UsersAdapter.UserViewHolder>() {

    class UserViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        val txtName: TextView = itemView.findViewById(R.id.txtName)
        val txtMail: TextView = itemView.findViewById(R.id.txtMail)
        val txtStatus: TextView = itemView.findViewById(R.id.txtStatus)
    }

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

    override fun onBindViewHolder(holder: UserViewHolder, position: Int) {
        val item = usersList[position]
        holder.txtName.text = item.name
        holder.txtMail.text = item.mail
        holder.txtStatus.text = item.status.text
        holder.txtStatus.setBackgroundColor(item.status.color)
    }

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

Es en está parte donde más se puede observar la utilidad de usar enums, ya que con solo definir una propiedad con el tipo del enum correspondiente, en este caso UserStatus, se puede acceder a varias características definidas en el enum. Como se puede observar mediante el enum podemos tener un código del status, un texto que puede ser visualizado por una persona y el color del elemento de vista.

8. Finalmente unimos todo en MainActivity.

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.recyclerview.widget.LinearLayoutManager
import kotlinx.android.synthetic.main.activity_main.*
import java.util.*
import kotlin.collections.ArrayList

class MainActivity : AppCompatActivity() {

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

    private fun setUpList() {
        val adapter = UsersAdapter(User.getUsers())
        usersList.adapter = adapter
        usersList.layoutManager = LinearLayoutManager(this)
    }
}


Comenta tus dudas en la sección de comentarios.

Comentarios