RecyclerView vs. ListView

295

Do desenvolvedor android ( Criando listas e cartões ):

O widget RecyclerView é uma versão mais avançada e flexível do ListView.

Tudo bem, parece legal, mas quando vi esse exemplo, fiquei muito confuso sobre a diferença entre os dois.

insira a descrição da imagem aqui

A imagem acima pode ser facilmente criada ListViewusando um adaptador personalizado.

Então, em que situação se deve usar RecyclerView?

Blaze Tama
fonte
1
@ Dev786: Sugiro que você adicione um comentário aqui explicando em detalhes o que você sente que está faltando no muitas respostas existentes sobre esta questão.
CommonsWare

Respostas:

374

RecyclerViewfoi criado como uma ListViewmelhoria, portanto, sim, você pode criar uma lista anexada com ListViewcontrole, mas usar RecyclerViewé mais fácil, pois:

  1. Reutiliza células ao rolar para cima / para baixo - isso é possível com a implementação do View Holder no ListViewadaptador, mas era uma coisa opcional, enquanto na RecycleViewforma padrão de escrita do adaptador.

  2. Separa a lista de seu contêiner - para que você possa colocar itens da lista facilmente em tempo de execução nos diferentes contêineres (linearLayout, gridLayout) com a configuração LayoutManager.

Exemplo:

mRecyclerView = (RecyclerView) findViewById(R.id.my_recycler_view);
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
//or
mRecyclerView.setLayoutManager(new GridLayoutManager(this, 2));
  1. Anima ações comuns da lista - as animações são dissociadas e delegadas ItemAnimator.

Há mais RecyclerView, mas acho que esses pontos são os principais.

Portanto, para concluir, RecyclerViewexiste um controle mais flexível para lidar com "dados da lista" que segue padrões de delegação de preocupações e deixa para si apenas uma tarefa - itens de reciclagem.

daneejela
fonte
16
A principal responsabilidade da exibição da lista é 1.) organizar visualmente os itens dentro de uma determinada área e, de preferência 2.) reutilizar os itens. Com o RecylerView, isso divide-se em responsabilidades únicas - a exibição de reciclagem recicla e o LayoutManager organiza os itens na tela. Em outras palavras, a exibição de reciclagem não sabe / se importa onde colocar itens na tela, apenas cuida de reciclá-los. De doc android: "Ao alterar a LayoutManager um RecyclerView pode ser usado para implementar um padrão de lista de rolagem vertical, uma grade uniforme, cambaleou grades, de rolagem horizontal coleções e muito mais."
daneejela
32
"Reutilizar células ao rolar para cima / para baixo": Até onde eu sei, isso está completamente errado, porque isso acontece mesmo na exibição de lista sem o viewholder.
Ruban
16
O principal uso do detentor de exibição no listview é Seu código pode chamar findViewById () frequentemente durante a rolagem do ListView, o que pode diminuir o desempenho. Mesmo quando o adaptador retorna uma visualização inflada para reciclagem, você ainda precisa procurar os elementos e atualizá-los. Uma maneira de contornar o uso repetido de findViewById () é usar o padrão de design "view holder". Um objeto ViewHolder armazena cada uma das visualizações de componentes dentro do campo de tag do Layout, para que você possa acessá-las imediatamente sem a necessidade de procurá-las repetidamente.
Ruban
7
O que eu tento dizer é que Row será reciclado mesmo quando você implementar o listview sem o suporte da visualização. Essa é a propriedade e a vantagem do listview. Isso é o que eles criaram listview.
Ruban
eles não fizeram nada de especial, esses recursos podem ser adicionados por qualquer pessoa. você pode estender o ListView e o baseAdapter e adicionar qualquer recurso, se desejar. na verdade, não há diferença entre esses dois.
MDP
39

Para que as visualizações de lista tenham um bom desempenho, você precisará implementar o padrão de suporte, e isso é fácil de atrapalhar, especialmente quando você deseja preencher a lista com vários tipos diferentes de visualizações.

O RecyclerView integra esse padrão, dificultando a bagunça. Também é mais flexível, facilitando o manuseio de diferentes layouts, que não são lineares, como uma grade.

CaptRespect
fonte
6
Sim ! , deve haver mais discussões sobre quando NÃO usar a visualização de reciclagem também. Se suas linhas tiverem conteúdo adicionado dinamicamente com base nos dados do modelo e você usar a visualização Reciclador, BOOM.
Rana Deep
1
Você deve poder adicionar conteúdo dinâmico com base nos dados do modelo. Você só precisará configurar visualizações diferentes para qualquer tipo de conteúdo que você queira oferecer suporte.
CaptRespect
36

ListViewé o ancestral de RecyclerView. Havia muitas coisas que ListViewnão fizeram ou não fizeram bem. Se você reunisse as deficiências do ListViewe resolvesse o problema abstraindo os problemas em domínios diferentes, acabaria com algo como a exibição do reciclador. Aqui estão os principais pontos problemáticos do ListViews:

  • Não aplicou a Viewreutilização para os mesmos tipos de itens (observe um dos adaptadores usados ​​em a ListView, se você estudar o método getView, verá que nada impede que um programador crie uma nova exibição para cada linha, mesmo que uma seja passada através da convertViewvariável)

  • Não impediu findViewByIdusos dispendiosos (mesmo que você estivesse reciclando visualizações, como observado acima, era possível que os desenvolvedores ligassem para findViewByIdatualizar o conteúdo exibido das visualizações filho. O principal objetivo do ViewHolderpadrão ListViewsera armazenar em cache as findViewByIdchamadas. No entanto, isso era apenas disponível se você soubesse, pois não fazia parte da plataforma)

  • Somente rolagem vertical suportada com vistas exibidas por linha (a vista do Recycler não se importa com o local onde as vistas são colocadas e como são movidas, ela é abstraída para um LayoutManager. Um recycler pode, portanto, suportar o tradicional ListViewcomo mostrado acima, bem como coisas como GridView, mas não se limita a isso, pode fazer mais, mas você precisa fazer o trabalho de programação para que isso aconteça).

  • As animações a serem adicionadas / removidas não foram consideradas como um caso de uso. Dependia completamente de você descobrir como fazer isso (compare as classes RecyclerView. Adapter e notifique * as ofertas de métodos v. ListViews para ter uma idéia).

Em suma, RecyclerViewé uma abordagem mais flexível ListView, embora ainda seja necessário fazer mais codificação de sua parte.

Jim Baca
fonte
20

o RecyclerView é um novo ViewGroup preparado para renderizar qualquer visualização baseada em adaptador de maneira semelhante. É suposto ser o sucessor de ListView and GridView, e pode ser encontrado no latest support-v7 version. O RecyclerViewfoi desenvolvido com a extensibilidade em mente, por isso é possível criar qualquer tipo de layout que você possa imaginar, mas não sem uma pequena dose de dor de bunda.

Resposta de Antonio leiva

 compile 'com.android.support:recyclerview-v7:27.0.0'

RecyclerViewé realmente um powerful viewdo queListView . Para mais detalhes, você pode visitar esta página .

IntelliJ Amiya
fonte
5
Gosto desta frase da sua resposta: este é o Android, então as coisas nunca são fáceis Isso é verdade para o que o desenvolvimento de aplicativos para Android tem sido, mas acho que há algo errado na maneira como eles projetaram a API e nos padrões para criar Aplicativo para Android. Teoricamente, um bom design deve ocultar todas as complexidades possíveis dos programadores (mas ainda assim acessíveis para os avançados); o que eles geralmente se preocupam é com a lógica de negócios, dados e outros algoritmos que não lutam para lidar com problemas relacionados à interface do usuário (e problemas mais tediosos atualmente presentes). no desenvolvimento do Android).
Hopeless
18

A seguir, são apresentados alguns pontos / diferenças importantes entre o RecyclerView e o ListView. Atenda sabiamente.

Se o ListView funcionar para você, não há motivo para migrar. Se você estiver escrevendo uma nova interface do usuário, talvez seja melhor usar o RecyclerView.

O RecylerView possui o ViewHolder embutido, não precisa implementar o nosso próprio como no listView. Ele suporta notificar em um índice específico também

Coisas como animar a adição ou remoção de itens já estão implementadas no RecyclerView sem que você precise fazer nada

Podemos associar um gerenciador de layout a um RecyclerView, que pode ser usado para obter visualizações aleatórias na revisão de reciclagem, enquanto isso era uma limitação no ListView Em um ListView, o único tipo de visualização disponível é o ListView vertical. Não existe uma maneira oficial de implementar um ListView horizontal. Agora, usando um RecyclerView, podemos ter um

i) LinearLayoutManager - que suporta listas verticais e horizontais, ii) StaggeredLayoutManager - que suporta Pinterest como listas escalonadas, iii) GridLayoutManager - que suporta a exibição de grades, como visto nos aplicativos da Galeria.

E o melhor é que podemos fazer tudo isso dinamicamente como queremos.

Pawan Maheshwari
fonte
14

Grande vantagem:

ViewHoldernão está disponível por padrão em ListView. Nós estaremos criando explicitamente dentro do arquivo getView(). RecyclerViewtem embutido Viewholder.

Mohammed Imran N
fonte
4

Além das diferenças acima, seguem-se mais algumas:

  1. O RV separa a criação da visualização e a ligação de dados para visualização. No LV, é necessário verificar se o convertView é nulo ou não para a criação de visualização, antes de vincular dados a ele. Portanto, no caso de RV, a visualização será criada apenas quando for necessário, mas no caso de LV, pode-se perder a verificação do convertview e criar a visualização sempre.

  2. Alternar entre Grade e Lista é mais fácil agora com o LayoutManager.

  3. Não há necessidade de notificar e atualizar todos os itens, mesmo que apenas um item seja alterado.

  4. Era preciso implementar o cache de visualização no caso de LV. É fornecido no RV por padrão. (Há diferença entre exibir cache e reciclagem.)

  5. Animações de itens muito fáceis em caso de RV.

Virat18
fonte
4

Vantagens do RecyclerView sobre a lista:

  1. Contém o ViewHolder por padrão.

  2. Animações fáceis.

  3. Suporta layouts horizontais, de grade e escalonados

Vantagens do listView sobre o recyclerView:

  1. Fácil de adicionar divisor.

  2. Pode usar arrayAdapter embutido para listas simples e simples

  3. Suporta cabeçalho e rodapé.

  4. Suporta OnItemClickListner.

Manohar Reddy
fonte
4
Tanto quanto eu entendo, você pode facilmente adicionar um divisor para um recyclerView usando recyclerView.addItemDecoration(new DividerItemDecoration(getContext(), LinearLayoutManager.VERTICAL));depois de fazer algo comorecyclerView = view.findViewById(R.id.feed);
nviens
1
@nviens Para exibição em lista, você pode adicionar um divisor, ajustar sua altura e alterar sua cor em xml. Também IMPLEMENTAÇÃO atual para divisor é apenas ok, foi um pesadelo para adicionar divisor para recyclerview anteriormente, basta verificar esta resposta para ver como a implementação anterior de divisor foi stackoverflow.com/a/27037230/6478047
Manohar Reddy
4

8 diferenças entre RecyclerView e ListView

Recyclerview vs ListView

1. Padrão do ViewHolder

O padrão usado para reduzir as chamadas para findViewById () métodos .

No ListView, você pode criar facilmente uma lista sem usar o ViewHolder. Mas não no caso do RecyclerView.

2. Adaptador

Ambos são AdapterViews, sim. Funciona com base na classe do adaptador.

É fácil criar o ListView usando adaptadores padrão como ArrayAdapter, CursorAdapter, mas o RecyclerView fornece a classe RecyclerView.Adapter, Para criar uma nova classe de adaptador personalizada.

Você não pode usar o ArrayAdapter ou qualquer outro adaptador interno com o RecyclerView.

3. Disposição dos itens

Eu criei o ListView vertical em código simples e menos. Mas e se precisarmos criar um GridView?

O RecyclerView usa o LayoutManager para organizar seus itens. Existem 3 classes LayoutManager.

  • LinearLayoutManager - ajuda a criar uma lista de tipos lineares.
  • GridLayoutManager - Usado para criar Grid.
  • StaggeredGridLayoutManager - Usado para criar staggeredgrid.

Animações

ListView não possui animações básicas. Mas o RecyclerView vem com animações simples.

Divisor

O android: divider e android: dividerHeight atributos ou setDivider (), setDividerHeight () ajudam a criar um divisor personalizado no ListView.

desde 25.1.0, você pode usar o DividerItemDecoration classe para criar um divisor simples.

Clique em Eventos

O RecyclerView não possui o OnItemClickListener , sim, isso é muito triste. Mas eles dão mais controle ao desenvolvedor, fornecendo RecyclerView.OnItemTouchListener.

Métodos de notificação

Você precisa chamar os métodos de notificação * adequados para executar as animações corretas. O RecylcerView possui muitos métodos de notificação * quando comparado ao ListView.

Vijay Ram
fonte
3

Eu acho que a principal e maior diferença que eles têm é que ListViewprocura a posição do item ao criar ou colocá-lo, por outro lado, RecyclerViewprocura o tipo do item. se houver outro item criado com o mesmo tipo RecyclerView, não o crie novamente. Ele solicita o primeiro adaptador e, em seguida, pede ao pool de reciclagem, se o pool reciclado diz "sim, eu criei um tipo semelhante a ele", então RecyclerViewnão tenta criar o mesmo tipo. ListViewnão possui esse tipo de mecanismo de agrupamento.

Mustafa Güven
fonte
2

Na minha opinião, RecyclerViewfoi feito para resolver o problema com o padrão de reciclagem usado nas visualizações de lista porque estava dificultando a vida do desenvolvedor. Todos os outros que você poderia lidar com mais ou menos. Por exemplo, eu usar o mesmo adaptador para ListViewe GridViewnão importa em ambos os pontos de vista das getView, getItemCount, getTypeCounté usado por isso é o mesmo. RecyclerViewnão é necessário se, ListViewcom ListAdapterou GridViewcom adaptadores de grade, já estiver funcionando para você. Se você implementou corretamente o ViewHolderpadrão em suas visualizações de lista, não verá grandes melhorias RecycleView.

aimiliano
fonte
2

Eu trabalhei um pouco com RecyclerViewe ainda prefiro ListView.

  1. Claro, os dois usam ViewHolders, então isso não é uma vantagem.

  2. A RecyclerViewé mais difícil na codificação.

  3. A RecyclerViewnão contém um cabeçalho e rodapé, portanto é um sinal de menos.

  4. A ListViewnão requer a criação de um ViewHolder. Nos casos em que você deseja ter uma lista com seções ou subtítulos, seria uma boa ideia criar itens independentes (sem um ViewHolder), é mais fácil e não requer classes separadas.

CoolMind
fonte
1
você pode colocar o cabeçalho e o lado do conteúdo no adaptador de recyclerview e ele será mais flexível que o listview. apenas difícil de mudar ur mente listview para recyclerview mas se você pode fazer isso, você vai entender o que eu mean.listview obsoleto Just Go tentar aprender goodluck recyclerview
erginduran
2
@erginduran, eu usei os dois. O ListView ainda é amplamente usado e não é preterido. Também desperdiça menos memória que o RecyclerView. Se você deseja substituir apenas um ListView pelo RecyclerView, não será uma boa ideia.
CoolMind 26/09/16
basta verificar por que esse pessoal desenvolveu a reciclagem para? o aprimoramento do listview, certo? Existem muitas bibliotecas e aplicativos antigos no Google Play, então você está certo. A visualização de lista ainda é amplamente usada. Apenas deixe coisas antigas no passado. verificar comparações -> link
erginduran
@erginduran, obrigado. Você está certo, o RecyclerView tem algumas vantagens. Minha resposta foi sobre tarefas comuns em que um ListView às vezes é mais fácil do que um RecyclerView. Obviamente, animação e algumas outras melhorias são difíceis ou impossíveis em um ListView.
CoolMind 26/09/16
Eu adicionei alguns aspectos nesse tópico, consulte stackoverflow.com/a/39721769/2914140 .
CoolMind 27/09/16
1
  1. Você pode usar uma interface para fornecer um ouvinte de clique. Também uso essa técnica com o ListViews.
  2. Sem divisor: basta adicionar na sua linha uma Visualização com largura de match_parent e altura de 1dp e dar uma cor de fundo.
  3. Basta usar um seletor StateList para o fundo da linha.
  4. O addHeaderView também pode ser evitado nos ListViews: basta colocar o cabeçalho fora da visualização.

Portanto, se a sua preocupação é com eficiência, é uma boa ideia substituir um ListView por um RecyclerView.

Jay Patel
fonte
0

Resposta simples: você deve usar o RecyclerView em uma situação em que deseja mostrar muitos itens e o número deles é dinâmico. O ListView deve ser usado apenas quando o número de itens é sempre o mesmo e está limitado ao tamanho da tela.

Você acha mais difícil porque pensa apenas com a biblioteca do Android em mente.

Hoje existem muitas opções que ajudam a criar seus próprios adaptadores, facilitando a criação de listas e grades de itens dinâmicos que você pode escolher, reordenar, usar animação, divisores, adicionar rodapés, cabeçalhos, etc.

Não se assuste e tente usar o RecyclerView, você pode começar a adorar fazer uma lista de 100 itens baixados da web (como notícias do facebook) em um ListView e um RecyclerView; você verá a diferença no UX (usuário). experiência) ao tentar rolar, provavelmente o aplicativo de teste será interrompido antes que você possa fazer isso.

Eu recomendo que você verifique essas duas bibliotecas para facilitar os adaptadores:

FastAdapter por mikepenz

FlexibleAdapter por davideas

Erick Moya
fonte
1
Eu acho que suas declarações sobre a diferença de desempenho entre os dois são exageradas. Uso o ListView em um aplicativo de produção desde 2012, exibindo até 3000 itens com ~ 10 modos de exibição diferentes em cada linha, absolutamente sem problemas de desempenho, mesmo em dispositivos Android 2.3 antigos.
Magnus W
0

Ver informações

O RecyclerViewfoi introduzido com Android 5.0 (Lollipop). está incluído na biblioteca de suporte . Portanto, é compatível com o nível 7 da API do Android.

Da mesma forma que a idéia principal ListView, RecyclerView’sé fornecer a funcionalidade de listagem de maneira amigável ao desempenho. A parte 'Reciclador' do nome dessa visualização não está lá por coincidência. O RecyclerViewpode realmente reciclar os itens com os quais está trabalhando atualmente. O processo de reciclagem é feito graças a um padrão chamado View Holder .

Prós e contras de RecyclerView

Prós:

  • animações integradas para adicionar, atualizar e remover itens
  • reforça a reciclagem de visualizações usando o padrão ViewHolder
  • suporta grades e listas
  • suporta rolagem vertical e horizontal
  • pode ser usado junto com o DiffUtil

Contras:

  • adiciona complexidade
  • no OnItemClickListener

Informações do ListView

Ele ListViewexiste desde o início do Android. Estava disponível mesmo em API Level 1e tem o mesmo objetivo que o RecyclerView.

O uso do ListView é realmente muito simples. Nesse aspecto, não é como seu sucessor. A curva de aprendizado é mais suave que a do RecyclerView. Assim, é mais fácil de entender. Não precisamos lidar com coisas como o LayoutManager, o ItemAnimator ou o DiffUtil.

Prós e contras do ListView

Prós:

  • uso simples
  • adaptadores padrão
  • disponível OnItemClickListener
  • é a base do ExpandableListView

Contras:

  • não adota o uso do padrão ViewHolder
Basi
fonte
0

Existem muitas diferenças entre o ListView e o RecyclerView, mas você deve estar ciente do seguinte, em particular:

  • O padrão ViewHolder é totalmente opcional no ListView, mas é inserido no RecyclerView.
  • O ListView suporta apenas rolagem vertical, mas o RecyclerView não se limita às listas de rolagem vertical.
sachin pareek
fonte