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' }
<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
Publicar un comentario