Este codelab faz parte do curso Conceitos básicos do Kotlin para Android. Você aproveitará mais o curso se fizer os codelabs em sequência. Todos os codelabs do curso estão listados na página de destino dos codelabs do curso Conceitos básicos do Kotlin para Android.
Introdução
Um dos principais pontos fortes de RecyclerView
é que ele permite que você use gerenciadores de layout para controlar e modificar a estratégia de layout. Um LayoutManager
gerencia como os itens no RecyclerView
são organizados.
O RecyclerView
vem com gerenciadores de layout prontos para casos de uso comuns. Por exemplo, é possível usar LinearLayout
para listas horizontais e verticais, ou GridLayout
para grades. Para casos de uso mais complicados, é necessário implementar uma LayoutManager
personalizada.
Neste codelab, você aprenderá a exibir dados usando um layout de grade em vez de uma lista, com base no app monitor de sono do codelab anterior. Se você não tiver o app do codelab anterior, faça o download do código inicial para este codelab.
O que você já precisa saber
Você precisa:
- Como criar uma interface de usuário básica usando
Activity
,Fragments
eViews
- Como navegar entre fragmentos e usar
safeArgs
para transmitir dados entre eles. - Visualizar modelos, visualizar fábricas de modelos e transformações
LiveData
e os observadores- Como criar um banco de dados
Room
, um DAO e definir entidades - Como usar corrotinas para tarefas de banco de dados e outras tarefas de longa duração
- Como implementar um
RecyclerView
básico com umAdapter
,ViewHolder
e o layout do item. - Como implementar a vinculação de dados para o
RecyclerView
. - Como criar e usar adaptadores de vinculação para transformar dados.
O que você vai aprender
- Como usar um
LayoutManager
diferente para mudar a forma como os dados são exibidos noRecyclerView
. - Como criar um layout de grade para os dados de sono
Atividades do laboratório
- Use o app monitor de sono do codelab anterior desta série.
- Substitua a lista de dados de sono exibida pelo
RecyclerView
no app por uma grade de dados de sono.
O app monitor de sono tem duas telas, representadas por fragmentos, como mostrado na figura abaixo.
A primeira tela, mostrada à esquerda, tem botões para iniciar e interromper o rastreamento. A tela mostra alguns dados de sono do usuário. O botão Limpar exclui permanentemente todos os dados que o app coletou para o usuário. A segunda tela, mostrada à direita, serve para selecionar uma classificação de qualidade do sono.
Esse app usa uma arquitetura simplificada com um controlador de IU, modelo de visualização e LiveData
, além de um banco de dados Room
para manter os dados de sono.
Os dados de sono são exibidos em um RecyclerView
. Neste codelab, você mudará o app para usar uma GridLayout
. A tela final será parecida com a captura de tela abaixo.
Em um codelab anterior, quando você adicionou a RecyclerView
à fragment_sleep_tracker.xml
, adicionou uma LinearLayoutManager
sem personalizações. Esse código exibe os dados como uma lista vertical.
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
O LinearLayoutManager
é o gerenciador de layout mais comum e direto para RecyclerView
e é compatível com o posicionamento horizontal e vertical de visualizações filhas. Por exemplo, você pode usar LinearLayoutManager
para criar um carrossel de imagens que o usuário rola horizontalmente.
GridLayout
Outro caso de uso comum é a necessidade de mostrar muitos dados ao usuário, o que pode ser feito usando GridLayout
. O GridLayoutManager
de RecyclerView
dispõe os dados como uma grade rolável, conforme mostrado abaixo.
Da perspectiva do design, o GridLayout
é melhor para listas que podem ser representadas como ícones ou imagens, como listas em um app de navegação fotográfica. No app monitor de sono, você pode exibir cada noite de sono como uma grade de ícones grandes. Com isso, o usuário teria uma visão geral da qualidade do sono.
Como o GridLayout dispõe os itens
GridLayout
organiza itens em uma grade de linhas e colunas. Presumindo a rolagem vertical, por padrão, cada item em uma linha ocupa um "período". Nesse caso, um período é equivalente à largura de uma coluna.
Nos dois primeiros exemplos mostrados abaixo, cada linha é composta por três períodos. Por padrão, o GridLayoutManager
dispõe cada item em um período até atingir a contagem do período que você especificar. Quando a contagem de períodos for atingida, os itens serão dispostos na próxima linha.
Por padrão, cada item ocupa um período, mas você pode aumentar a quantidade ao especificar quantos períodos ele deve ocupar. Por exemplo, o item superior na tela mais à direita (mostrado abaixo) ocupa três períodos.
Nesta tarefa, você usa a RecyclerView
que terminou no último exercício e a atualiza para exibir dados usando um GridLayoutManager
. Você pode continuar usando o app monitor de sono do codelab anterior ou pode fazer o download do app RecyclerViewGridLayout-Starter no GitHub.
Etapa 1: mudar o LayoutManager
- Se necessário, faça o download do app RecyclerViewGridLayout-Starter para este codelab do GitHub e abra o projeto no Android Studio.
- Abra o arquivo de layout
fragment_sleep_tracker.xml
. - Remova o gerenciador de layout da definição
sleep_list
RecyclerView
.
Código a ser excluído:
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager
- Abra o
SleepTrackerFragment.kt
- Em
OnCreateView()
, logo antes da instruçãoreturn
, crie um novoGridLayoutManager
vertical, de cima para baixo, com três períodos.
O construtorGridLayoutManager
usa até quatro argumentos: um contexto, que é oactivity
, o número de períodos (colunas, no layout vertical padrão), uma orientação (o padrão é vertical) e se é um layout reverso (o padrão éfalse
).
val manager = GridLayoutManager(activity, 3)
- Abaixo dessa linha, instrua o
RecyclerView
a usar esseGridLayoutManager
. ORecyclerView
está no objeto de vinculação e é chamado desleepList
. Consultefragment_sleep_tracker.xml
.
binding.sleepList.layoutManager = manager
Etapa 2: alterar o layout
O layout atual em list_item_sleep_night.xml
exibe os dados usando uma linha inteira por noite. Nesta etapa, você definirá um layout de item quadrado mais compacto para a grade.
- Abra o
list_item_sleep_night.xml
- Exclua o
sleep_length
TextView
porque o novo design não precisa dele. - Mova a
quality_string
TextView
para que ela seja exibida abaixo doImageView
. Para fazer isso, é necessário atualizar várias coisas. Este é o layout final doTextView
daquality_string
:
<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}" />
- Verifique na visualização Design se o
quality_string
TextView
está posicionado abaixo doImageView
.
Como você usou a vinculação de dados, não é necessário alterar nada no Adapter
. O código funcionará normalmente e sua lista será exibida como uma grade.
- Execute o app e observe como os dados de sono são exibidos em uma grade.
Observe que aConstraintLayout
ainda ocupa toda a largura. OGridLayoutManager
oferece uma largura fixa à visualização, com base no período dela.GridLayoutManager
faz o possível para atender a todas as restrições ao dispor a grade, adicionando espaços em branco ou recortando itens.
- No
SleepTrackerFragment
, no código que cria oGridLayoutManager
, mude o número de períodos deGridLayoutManger
para 1. Execute o app e você receberá uma lista.
val manager = GridLayoutManager(activity, 1)
- Mude o número de períodos de
GridLayoutManager
para 10 e execute o app. Observe que oGridLayoutManager
caberá em 10 itens seguidos, mas os itens serão cortados. - Mude a contagem de períodos para 5 e a direção para
GridLayoutManager.VERTICAL
. Execute o app e veja como você pode rolar na horizontal. Você precisa de um layout diferente para criar uma boa aparência.
val manager = GridLayoutManager(activity, 5, GridLayoutManager.HORIZONTAL, false)
- Não se esqueça de definir a contagem de períodos novamente como 3 e a orientação como vertical.
Projeto do Android Studio: RecyclerViewGridLayout
- Os gerenciadores de layout gerenciam a organização dos itens na
RecyclerView
. - O
RecyclerView
vem com gerenciadores de layout prontos para casos de uso comuns, comoLinearLayout
para listas horizontais e verticais eGridLayout
para grades. - Para casos de uso mais complicados, implemente um
LayoutManager
personalizado. - Da perspectiva do design, o
GridLayout
é mais indicado para listas de itens que podem ser representados como ícones ou imagens. GridLayout
organiza itens em uma grade de linhas e colunas. Considerando a rolagem vertical, cada item em uma linha ocupa o que é chamado de "span."- Você pode personalizar quantos períodos um item ocupa, criando grades mais interessantes sem a necessidade de um gerenciador de layout personalizado.
- Crie um layout para um item na grade, e o gerenciador de layout cuida da organização dos itens.
- Você pode definir a
LayoutManager
paraRecyclerView
no arquivo de layout XML que contém o elemento<RecyclerView>
ou de forma programática.
Cursos da Udacity:
Documentação do desenvolvedor Android:
Esta seção lista as possíveis atividades para os alunos que estão trabalhando neste codelab como parte de um curso ministrado por um instrutor. Cabe ao instrutor fazer o seguinte:
- Se necessário, atribua o dever de casa.
- Informe aos alunos como enviar o dever de casa.
- Atribua nota aos trabalhos de casa.
Os professores podem usar essas sugestões o quanto quiserem, e eles devem se sentir à vontade para passar o dever de casa como achar adequado.
Se você estiver fazendo este codelab por conta própria, use essas atividades para testar seu conhecimento.
Responda a estas perguntas
Pergunta 1
Quais das opções a seguir são gerenciadores de layout fornecidos pelo Android? Selecione todas as opções aplicáveis.
▢ LinearLayouManager
▢ GridLayoutManager
▢ CircularLayoutManager
▢ StaggeredGridLayoutManager
Pergunta 2
O que é um "span"?
▢ O tamanho da grade criada pelo GridLayoutManager
.
▢ A largura de uma coluna na grade.
▢ As dimensões de um item em uma grade.
▢ O número de colunas em uma grade com orientação vertical.
Inicie a próxima lição: