Mantenha tudo organizado com as coleções
Salve e categorize o conteúdo com base nas suas preferências.
Personalizar uma lista dinâmica
Parte do Android Jetpack.
Teste o jeito do Compose
O Jetpack Compose é o kit de ferramentas de UI recomendado para Android. Aprenda a trabalhar com layouts no Compose.
É possível personalizar objetos
RecyclerView
para atender às suas necessidades específicas. As classes padrão descritas em
Criar listas dinâmicas com
RecyclerView fornecem toda a funcionalidade que a maioria dos desenvolvedores precisa. Em
muitos casos, você só precisa projetar a visualização para cada fixador de visualização e escrever o
código para atualizar essas visualizações com os dados apropriados. No entanto, se o app tiver
requisitos específicos, você poderá modificar o comportamento padrão de várias maneiras.
Este documento descreve algumas das personalizações possíveis.
Modificar o layout
O RecyclerView
usa um gerenciador de layout para posicionar os itens individuais na tela e determinar quando reutilizar visualizações de itens que não estão mais visíveis para o usuário. Para reutilizar (ou reciclar) uma visualização, um gerenciador de layout pode pedir ao adaptador para substituir o conteúdo da visualização por um elemento diferente do conjunto de dados. Reciclar visualizações dessa maneira melhora
o desempenho, evitando a criação de visualizações desnecessárias ou a realização de
pesquisas
findViewById()
caras. A Biblioteca de Suporte do Android inclui três gerenciadores de layout padrão, e cada um deles oferece muitas opções de personalização:
LinearLayoutManager
:
organiza os itens em uma lista unidimensional. O uso de um
RecyclerView
com LinearLayoutManager
fornece
funcionalidade como um
layout ListView
.
GridLayoutManager
:
organiza os itens em uma grade bidimensional, como os quadrados em um
quadriculado. O uso de um RecyclerView
com
GridLayoutManager
fornece funcionalidades como um
layout GridView
.
StaggeredGridLayoutManager
:
organiza os itens em uma grade bidimensional, com cada coluna um pouco diferente
da anterior, por exemplo, as estrelas em uma bandeira americana.
Se esses gerenciadores de layout não atenderem às suas necessidades, crie um estendendo a classe abstrata RecyclerView.LayoutManager
.
Adicionar animações de itens
Sempre que um item muda, o RecyclerView
usa um animador
para alterar a aparência dele. Esse animador é um objeto que estende a classe abstrata
RecyclerView.ItemAnimator
. Por padrão, o RecyclerView
usa
DefaultItemAnimator
para fornecer a animação. Para fornecer animações personalizadas, defina seu próprio objeto animador estendendo RecyclerView.ItemAnimator
.
Ativar a seleção de itens de lista
A biblioteca
recyclerview-selection
permite que os usuários selecionem itens em uma lista RecyclerView
usando a entrada por toque
ou mouse. Isso permite que você mantenha o controle sobre a apresentação visual de um
item selecionado. Você também pode manter o controle sobre as políticas que controlam o comportamento de seleção, por exemplo, quais itens podem ser selecionados e quantos itens podem ser selecionados.
Para adicionar suporte de seleção a uma instância do RecyclerView
, siga
estas etapas:
- Determine qual tipo de chave de seleção usar e crie um
ItemKeyProvider
.
Há três tipos principais que você pode usar para identificar itens selecionados:
Para informações detalhadas sobre os tipos de chave de seleção, consulte
SelectionTracker.Builder
.
- Implemente
ItemDetailsLookup
.
ItemDetailsLookup
permite que a biblioteca de seleção acesse
informações sobre itens RecyclerView
que receberam
MotionEvent
.
Ele é efetivamente uma fábrica para instâncias de
ItemDetails
que são armazenadas em backup por ou extraídas de uma
instância de RecyclerView.ViewHolder
.
- Atualize os objetos do item
View
no
RecyclerView
para refletir se o usuário os seleciona ou
desmarca.
A biblioteca de seleção não fornece uma decoração visual padrão para os
itens selecionados. Forneça isso ao implementar
onBindViewHolder()
.
Recomendamos a seguinte abordagem:
- Use
ActionMode
para fornecer ao usuário ferramentas para executar uma ação na seleção.
Registre um
SelectionTracker.SelectionObserver
para ser notificado quando uma seleção mudar. Quando uma seleção for criada pela primeira vez,
inicie ActionMode
para apresentar isso ao usuário e forneça
ações específicas para a seleção. Por exemplo, você pode adicionar um botão "Excluir" à barra
ActionMode
e conectar a seta "Voltar" à barra para limpar
a seleção. Quando a seleção ficar vazia (se o usuário limpou a
seleção pela última vez), encerre o modo de ação.
- Realizar ações secundárias interpretadas.
No final do pipeline de processamento de eventos, a biblioteca pode determinar
que o usuário está tentando ativar um item tocando nele ou
arrastando um item ou conjunto de itens selecionados. Reaja a essas
interpretações registrando o listener apropriado. Para mais
informações, consulte
SelectionTracker.Builder
.
- Monte tudo com
SelectionTracker.Builder
.
O exemplo a seguir mostra como juntar essas partes:
Kotlin
var tracker = SelectionTracker.Builder(
"my-selection-id",
recyclerView,
StableIdKeyProvider(recyclerView),
MyDetailsLookup(recyclerView),
StorageStrategy.createLongStorage())
.withOnItemActivatedListener(myItemActivatedListener)
.build()
Java
SelectionTracker tracker = new SelectionTracker.Builder<>(
"my-selection-id",
recyclerView,
new StableIdKeyProvider(recyclerView),
new MyDetailsLookup(recyclerView),
StorageStrategy.createLongStorage())
.withOnItemActivatedListener(myItemActivatedListener)
.build();
Para criar uma instância de
SelectionTracker
, seu app precisa fornecer o mesmo
RecyclerView.Adapter
que você usa para inicializar RecyclerView
para
SelectionTracker.Builder
. Por isso, depois de criar a instância
SelectionTracker
, injete-a no seu
RecyclerView.Adapter
. Caso contrário, não será possível verificar o status selecionado de um item com o método onBindViewHolder()
.
- Inclua seleção nos eventos de ciclo de vida da atividade.
Para preservar o estado de seleção em todos os eventos do ciclo de vida da atividade, seu app
precisa chamar os métodos
onSaveInstanceState()
e
onRestoreInstanceState()
do rastreador de seleção dos métodos
onSaveInstanceState()
e
onRestoreInstanceState()
da atividade, respectivamente. Seu app também precisa fornecer um ID de seleção exclusivo para o
construtor SelectionTracker.Builder
. Esse ID é obrigatório porque
uma atividade ou um fragmento pode ter mais de uma lista distinta e selecionável,
e todas precisam ser mantidas no estado salvo.
Outros recursos
Consulte as referências a seguir para mais informações.
O conteúdo e os exemplos de código nesta página estão sujeitos às licenças descritas na Licença de conteúdo. Java e OpenJDK são marcas registradas da Oracle e/ou suas afiliadas.
Última atualização 2025-08-21 UTC.
[[["Fácil de entender","easyToUnderstand","thumb-up"],["Meu problema foi resolvido","solvedMyProblem","thumb-up"],["Outro","otherUp","thumb-up"]],[["Não contém as informações de que eu preciso","missingTheInformationINeed","thumb-down"],["Muito complicado / etapas demais","tooComplicatedTooManySteps","thumb-down"],["Desatualizado","outOfDate","thumb-down"],["Problema na tradução","translationIssue","thumb-down"],["Problema com as amostras / o código","samplesCodeIssue","thumb-down"],["Outro","otherDown","thumb-down"]],["Última atualização 2025-08-21 UTC."],[],[],null,["# Customize a dynamic list\nPart of [Android Jetpack](/jetpack).\n=============================================================\n\nTry the Compose way \nJetpack Compose is the recommended UI toolkit for Android. Learn how to work with layouts in Compose. \n[Lazy Lists and Grids →](/jetpack/compose/lists#lazy) \n\nYou can customize\n[RecyclerView](/reference/androidx/recyclerview/widget/RecyclerView)\nobjects to meet your specific needs. The standard classes described in\n[Create dynamic lists with\nRecyclerView](/guide/topics/ui/layout/recyclerview) provide all the functionality that most developers need. In\nmany cases, you only need to design the view for each view holder and write the\ncode to update those views with the appropriate data. However, if your app has\nspecific requirements, you can modify the standard behavior in a number of ways.\nThis document describes some of the possible customizations.\n\nModify the layout\n-----------------\n\n`RecyclerView` uses a layout manager to position the individual\nitems on the screen and to determine when to reuse item views that are no longer\nvisible to the user. To reuse---or *recycle* ---a view, a layout\nmanager might ask the adapter to replace the contents of the view with a\ndifferent element from the dataset. Recycling views this way improves\nperformance by avoiding the creation of unnecessary views or performing\nexpensive\n[findViewById()](/reference/android/app/Activity#findViewById(int))\nlookups. The Android Support Library includes three standard layout managers,\nach of which offers many customization options:\n\n- [LinearLayoutManager](/reference/androidx/recyclerview/widget/LinearLayoutManager): arranges the items in a one-dimensional list. Using a `RecyclerView` with `LinearLayoutManager` provides functionality like a [ListView](/reference/android/widget/ListView) layout.\n- [GridLayoutManager](/reference/androidx/recyclerview/widget/GridLayoutManager): arranges the items in a two-dimensional grid, like the squares on a checkerboard. Using a `RecyclerView` with `GridLayoutManager` provides functionality like a [GridView](/reference/android/widget/GridView) layout.\n- [StaggeredGridLayoutManager](/reference/androidx/recyclerview/widget/StaggeredGridLayoutManager): arranges the items in a two-dimensional grid, with each column slightly offset from the one before, like the stars on an American flag.\n\nIf these layout managers don't suit your needs, you can create your own by\nextending the\n[RecyclerView.LayoutManager](/reference/androidx/recyclerview/widget/RecyclerView.LayoutManager)\nabstract class.\n\nAdd item animations\n-------------------\n\nWhenever an item changes, `RecyclerView` uses an *animator*\nto change its appearance. This animator is an object that extends the abstract\n[RecyclerView.ItemAnimator](/reference/androidx/recyclerview/widget/RecyclerView.ItemAnimator)\nclass. By default, the `RecyclerView` uses\n[DefaultItemAnimator](/reference/androidx/recyclerview/widget/DefaultItemAnimator)\nto provide the animation. If you want to provide custom animations, you can\ndefine your own animator object by extending\n`RecyclerView.ItemAnimator`.\n\nEnable list-item selection\n--------------------------\n\nThe\n[`recyclerview-selection`](/reference/androidx/recyclerview/selection/package-summary)\nlibrary lets users select items in a `RecyclerView` list using touch\nor mouse input. This lets you retain control over the visual presentation of a\nselected item. You can also retain control over policies controlling selection\nbehavior, such as which items are eligible for selection and how many items can\nbe selected.\n\nTo add selection support to a `RecyclerView` instance, follow\nthese steps:\n\n1. Determine which selection key type to use, then build an [`ItemKeyProvider`](/reference/androidx/recyclerview/selection/ItemKeyProvider).\n\n There are three key types you can use to identify selected items:\n - [Parcelable](/reference/android/os/Parcelable) and its subclasses, like [Uri](/reference/android/net/Uri)\n - [String](/reference/java/lang/String)\n - [Long](/reference/java/lang/Long)\n\n For detailed information about selection-key types, see\n [SelectionTracker.Builder](/reference/androidx/recyclerview/selection/SelectionTracker.Builder).\n2. Implement [ItemDetailsLookup](/reference/androidx/recyclerview/selection/ItemDetailsLookup).\n3. `ItemDetailsLookup` lets the selection library access information about `RecyclerView` items given a [MotionEvent](/reference/android/view/MotionEvent). It is effectively a factory for [`ItemDetails`](/reference/androidx/recyclerview/selection/ItemDetailsLookup.ItemDetails) instances that are backed up by, or extracted from, a [RecyclerView.ViewHolder](/reference/androidx/recyclerview/widget/RecyclerView.ViewHolder) instance.\n4. Update item [View](/reference/android/view/View) objects in the `RecyclerView` to reflect whether the user selects or unselects them.\n\n The selection library doesn't provide a default visual decoration for the\n selected items. Provide this when you implement\n [onBindViewHolder()](/reference/androidx/recyclerview/widget/RecyclerView.Adapter#onBindViewHolder(VH, int)).\n We recommend the following approach:\n - In `onBindViewHolder()`, call [setActivated()](/reference/android/view/View#setActivated(boolean))---**not** [setSelected()](/reference/android/view/View#setSelected(boolean))---on the `View` object with `true` or `false`, depending on whether the item is selected.\n - Update the styling of the view to represent the activated status. We recommend using a [color state\n list resource](/guide/topics/resources/color-list-resource) to configure the styling.\n5. Use [ActionMode](/reference/androidx/appcompat/view/ActionMode) to provide the user with tools to perform an action on the selection.\n6. Register a [SelectionTracker.SelectionObserver](/reference/androidx/recyclerview/selection/SelectionTracker.SelectionObserver) to be notified when a selection changes. When a selection is first created, start `ActionMode` to present this to the user and provide selection-specific actions. For example, you can add a delete button to the `ActionMode` bar and connect the back arrow on the bar to clear the selection. When the selection becomes empty---if the user clears the selection the last time---terminate action mode.\n7. Perform any interpreted secondary actions.\n8. At the end of the event processing pipeline, the library might determine that the user is attempting to activate an item, by tapping it, or is attempting to drag an item or set of selected items. React to these interpretations by registering the appropriate listener. For more information, see [SelectionTracker.Builder](/reference/androidx/recyclerview/selection/SelectionTracker.Builder).\n9. Assemble everything with `SelectionTracker.Builder`.\n10. The following example shows how to put these pieces together: \n\n### Kotlin\n\n```kotlin\n var tracker = SelectionTracker.Builder(\n \"my-selection-id\",\n recyclerView,\n StableIdKeyProvider(recyclerView),\n MyDetailsLookup(recyclerView),\n StorageStrategy.createLongStorage())\n .withOnItemActivatedListener(myItemActivatedListener)\n .build()\n \n```\n\n### Java\n\n```java\n SelectionTracker tracker = new SelectionTracker.Builder\u003c\u003e(\n \"my-selection-id\",\n recyclerView,\n new StableIdKeyProvider(recyclerView),\n new MyDetailsLookup(recyclerView),\n StorageStrategy.createLongStorage())\n .withOnItemActivatedListener(myItemActivatedListener)\n .build();\n \n```\n11. To build a [SelectionTracker](/reference/androidx/recyclerview/selection/SelectionTracker) instance, your app must supply the same [RecyclerView.Adapter](/reference/androidx/recyclerview/widget/RecyclerView.Adapter) that you use to initialize `RecyclerView` to `SelectionTracker.Builder`. For this reason, after you create the `SelectionTracker` instance, inject it into your `RecyclerView.Adapter`. Otherwise, you can't check an item's selected status from the `onBindViewHolder()` method.\n12. Include selection in the [activity\n lifecycle](/guide/components/activities/activity-lifecycle) events.\n13. To preserve selection state across the activity lifecycle events, your app must call the selection tracker's [onSaveInstanceState()](/reference/androidx/recyclerview/selection/SelectionTracker#onSaveInstanceState(android.os.Bundle)) and [onRestoreInstanceState()](/reference/androidx/recyclerview/selection/SelectionTracker#onRestoreInstanceState(android.os.Bundle)) methods from the activity's [onSaveInstanceState()](/reference/android/app/Activity#onSaveInstanceState(android.os.Bundle)) and [onRestoreInstanceState()](/reference/android/app/Activity#onRestoreInstanceState(android.os.Bundle)) methods, respectively. Your app must also supply a unique selection ID to the `SelectionTracker.Builder` constructor. This ID is required because an activity or a fragment might have more than one distinct, selectable list, all of which need to be persisted in their saved state.\n\nAdditional resources\n--------------------\n\nSee the following references for additional information.\n\n- [Sunflower\n demo app](https://github.com/googlesamples/android-sunflower), which uses `RecyclerView`.\n- [Use\n RecyclerView to display a scrollable list](/codelabs/basic-android-kotlin-training-recyclerview-scrollable-list#0) codelab.\n- [Android\n Kotlin Fundamentals: RecyclerView fundamentals](/codelabs/kotlin-android-training-recyclerview-fundamentals) codelab."]]