Este codelab es parte del curso Conceptos básicos de Kotlin para Android. Aprovecharás al máximo este curso si trabajas con los codelabs de forma secuencial. Todos los codelabs del curso se enumeran en la página de destino de los codelabs de Android Kotlin Fundamentals.
Introducción
Una de las principales ventajas de RecyclerView
es que te permite usar administradores de diseño para controlar y modificar tu estrategia de diseño. Un LayoutManager
administra la forma en que se organizan los elementos en el RecyclerView
.
RecyclerView
incluye administradores de diseño listos para usar para casos de uso comunes. Por ejemplo, puedes usar LinearLayout
para listas horizontales y verticales, o GridLayout
para cuadrículas. Para casos de uso más complicados, debes implementar un LayoutManager
personalizado.
En este codelab, aprenderás a mostrar datos con un diseño de cuadrícula en lugar de una lista, basándote en la app de Sleep Tracker del codelab anterior. (Si no tienes la app del codelab anterior, puedes descargar el código de partida para este codelab).
Conocimientos que ya deberías tener
Debes estar familiarizado con lo siguiente:
- Cómo compilar una interfaz de usuario básica con
Activity
,Fragments
yViews
- Navegar entre fragmentos y usar
safeArgs
para pasar datos entre fragmentos - Visualiza modelos, fábricas de modelos y transformaciones
LiveData
y sus observadores- Cómo crear una base de datos
Room
, crear un DAO y definir entidades - Cómo usar corrutinas para tareas de bases de datos y otras tareas de larga duración
- Cómo implementar un
RecyclerView
básico con unAdapter
, unViewHolder
y un diseño de elemento - Cómo implementar la vinculación de datos para
RecyclerView
- Cómo crear y usar adaptadores de vinculación para transformar datos
Qué aprenderás
- Cómo usar un
LayoutManager
diferente para cambiar la forma en que se muestran tus datos en elRecyclerView
- Cómo crear un diseño de cuadrícula para tus datos de sueño
Actividades
- Compilar la app de Sleep Tracker del codelab anterior de esta serie
- Reemplaza la lista de datos de sueño que muestra
RecyclerView
en la app con una cuadrícula de datos de sueño.
La app de monitoreo del sueño tiene dos pantallas, representadas por fragmentos, como se muestra en la siguiente figura.
La primera pantalla, que se muestra a la izquierda, tiene botones para iniciar y detener el seguimiento. En la pantalla, se muestran algunos de los datos de sueño del usuario. El botón Borrar borra de forma permanente todos los datos que la app recopiló del usuario. La segunda pantalla, que se muestra a la derecha, es para seleccionar una calificación de la calidad del sueño.
Esta app usa una arquitectura simplificada con un controlador de IU, un ViewModel y LiveData
, y una base de datos Room
para conservar los datos de sueño.
Los datos de sueño se muestran en un RecyclerView
. En este codelab, cambiarás la app para que use un GridLayout
. La pantalla final se verá como la siguiente captura de pantalla.
En un codelab anterior, cuando agregaste RecyclerView
a fragment_sleep_tracker.xml
, agregaste un LinearLayoutManager
sin ninguna personalización. Este código muestra los datos como una lista vertical.
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
LinearLayoutManager
es el administrador de diseño más común y sencillo para RecyclerView
, y admite la colocación horizontal y vertical de vistas secundarias. Por ejemplo, puedes usar LinearLayoutManager
para crear un carrusel de imágenes por el que el usuario se desplace horizontalmente.
GridLayout
Otro caso de uso común es la necesidad de mostrarle muchos datos al usuario, lo que puedes hacer con GridLayout
. El objeto GridLayoutManager
de RecyclerView
define los datos como una cuadrícula desplazable, como se muestra a continuación.
Desde una perspectiva de diseño, GridLayout
es ideal para listas que se pueden representar como imágenes o íconos, como listas dentro de una app de navegación de fotos. En la app de monitoreo del sueño, podrías mostrar cada noche de sueño como una cuadrícula de íconos grandes. Este diseño le daría al usuario una descripción general de la calidad de su sueño de un vistazo.
Cómo GridLayout diseña los elementos
GridLayout
organiza los elementos en una cuadrícula de filas y columnas. Suponiendo que el desplazamiento es vertical, de forma predeterminada, cada elemento de una fila ocupa un "intervalo". (En este caso, un intervalo equivale al ancho de una columna).
En los dos primeros ejemplos que se muestran a continuación, cada fila está compuesta por tres intervalos. De forma predeterminada, el GridLayoutManager
coloca cada elemento en un intervalo hasta el recuento de intervalos que especificas. Cuando alcanza el recuento de intervalos, se ajusta a la siguiente línea.
De forma predeterminada, cada elemento ocupa un intervalo, pero puedes hacer que un elemento sea más ancho especificando cuántos intervalos debe ocupar. Por ejemplo, el primer elemento de la pantalla más a la derecha (que se muestra a continuación) ocupa tres tramos.
En esta tarea, tomarás el RecyclerView
que terminaste en el último ejercicio y lo actualizarás para mostrar datos con un GridLayoutManager
. Puedes seguir usando la app de Sleep Tracker del codelab anterior o descargar la app de RecyclerViewGridLayout-Starter desde GitHub.
Paso 1: Cambia el LayoutManager
- Si es necesario, descarga la app RecyclerViewGridLayout-Starter para este codelab desde GitHub y abre el proyecto en Android Studio.
- Abre el archivo de diseño
fragment_sleep_tracker.xml
. - Quita el administrador de diseño de la definición de
sleep_list
RecyclerView
.
Código que debes borrar:
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager
- Abre
SleepTrackerFragment.kt
. - En
OnCreateView()
, justo antes de la sentenciareturn
, crea un nuevoGridLayoutManager
vertical, de arriba hacia abajo, con 3 tramos.
El constructorGridLayoutManager
admite hasta cuatro argumentos: un contexto, que es elactivity
, la cantidad de tramos (columnas, en el diseño vertical predeterminado), una orientación (la predeterminada es vertical) y si es un diseño inverso (el valor predeterminado esfalse
).
val manager = GridLayoutManager(activity, 3)
- Debajo de esa línea, indícale a
RecyclerView
que use esteGridLayoutManager
. ElRecyclerView
se encuentra en el objeto de vinculación y se llamasleepList
. (Consultafragment_sleep_tracker.xml
).
binding.sleepList.layoutManager = manager
Paso 2: Cambia el diseño
El diseño actual en list_item_sleep_night.xml
muestra los datos con una fila completa por noche. En este paso, definirás un diseño de elemento cuadrado más compacto para la cuadrícula.
- Abre
list_item_sleep_night.xml
. - Borra el
sleep_length
TextView
, porque el nuevo diseño no lo necesita. - Mueve el
quality_string
TextView
para que se muestre debajo delImageView
. Para ello, debes actualizar varios elementos. Este es el diseño final delquality_string
TextView
:
<TextView
android:id="@+id/quality_string"
android:layout_width="0dp"
android:layout_height="20dp"
android:textAlignment="center"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="@+id/quality_image"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="@+id/quality_image"
app:layout_constraintTop_toBottomOf="@+id/quality_image"
tools:text="Excellent!!!"
app:sleepQualityString="@{sleep}" />
- Verifica en la vista Design que el
quality_string
TextView
esté ubicado debajo delImageView
.
Como usaste la vinculación de datos, no necesitas cambiar nada en Adapter
. El código debería funcionar y la lista debería mostrarse como una cuadrícula.
- Ejecuta la app y observa cómo se muestran los datos de sueño en una cuadrícula.
Ten en cuenta que elConstraintLayout
aún ocupa todo el ancho. ElGridLayoutManager
le da a tu vista un ancho fijo, según su extensión.GridLayoutManager
hace todo lo posible para cumplir con todas las restricciones cuando diseña la cuadrícula, agrega espacio en blanco o recorta elementos.
- En
SleepTrackerFragment
, en el código que crea elGridLayoutManager
, cambia la cantidad de tramos paraGridLayoutManger
a 1. Ejecuta la app y obtendrás una lista.
val manager = GridLayoutManager(activity, 1)
- Cambia la cantidad de tramos para
GridLayoutManager
a 10 y ejecuta la app. Observa queGridLayoutManager
ajustará 10 elementos en una fila, pero ahora los elementos se recortan. - Cambia el recuento de tramos a 5 y la dirección a
GridLayoutManager.VERTICAL
. Ejecuta la app y observa cómo puedes desplazarte horizontalmente. Necesitarías un diseño diferente para que se vea bien.
val manager = GridLayoutManager(activity, 5, GridLayoutManager.HORIZONTAL, false)
- No olvides volver a establecer el recuento de tramos en 3 y la orientación en vertical.
Proyecto de Android Studio: RecyclerViewGridLayout
- Los administradores de diseño controlan la forma en que se organizan los elementos en el
RecyclerView
. RecyclerView
incluye administradores de diseño listos para usar para casos de uso comunes, comoLinearLayout
para listas horizontales y verticales, yGridLayout
para cuadrículas.- Para casos de uso más complicados, implementa un
LayoutManager
personalizado. - Desde una perspectiva de diseño,
GridLayout
se usa mejor para listas de elementos que se pueden representar como íconos o imágenes. GridLayout
organiza los elementos en una cuadrícula de filas y columnas. Suponiendo que el desplazamiento es vertical, cada elemento de una fila ocupa lo que se denomina un "intervalo".- Puedes personalizar la cantidad de tramos que ocupa un elemento, lo que te permite crear cuadrículas más interesantes sin necesidad de un administrador de diseño personalizado.
- Crea un diseño de elemento para un elemento de la cuadrícula, y el administrador de diseño se encargará de organizar los elementos.
- Puedes establecer el
LayoutManager
para elRecyclerView
en el archivo de diseño XML que contiene el elemento<RecyclerView>
o de forma programática.
Cursos de Udacity:
Documentación para desarrolladores de Android:
En esta sección, se enumeran las posibles actividades para el hogar para los alumnos que trabajan en este codelab como parte de un curso dirigido por un instructor. Depende del instructor hacer lo siguiente:
- Si es necesario, asigna una tarea.
- Comunicarles a los alumnos cómo enviar las actividades para el hogar.
- Califica las actividades para el hogar.
Los instructores pueden usar estas sugerencias en la medida que quieran y deben asignar cualquier otra actividad para el hogar que consideren apropiada.
Si estás trabajando en este codelab por tu cuenta, usa estas actividades para el hogar para probar tus conocimientos.
Responde estas preguntas:
Pregunta 1
¿Cuáles de estas opciones son administradores de diseño que proporciona Android? Selecciona todas las opciones que correspondan.
▢ LinearLayouManager
▢ GridLayoutManager
▢ CircularLayoutManager
▢ StaggeredGridLayoutManager
Pregunta 2
¿Qué es un "intervalo"?
▢ El tamaño de una cuadrícula que crea GridLayoutManager
.
▢ El ancho de una columna en la cuadrícula
▢ Las dimensiones de un elemento en una cuadrícula.
▢ La cantidad de columnas en una cuadrícula que tiene orientación vertical.
Comienza la siguiente lección: