Devemos usar o RecyclerView para substituir o ListView?

232

Os documentos do Android dizem:

O widget RecyclerView é uma versão mais avançada e flexível do ListView. Este widget é um contêiner para exibir grandes conjuntos de dados que podem ser rolados com muita eficiência, mantendo um número limitado de visualizações. Use o widget RecyclerView quando tiver coleções de dados cujos elementos mudam em tempo de execução com base na ação do usuário ou em eventos de rede

Na verdade, ListViewpode fazer tudo o que precede, se a eficiência não importa, e encontramos muitos problemas quando usamos RecyclerViewpara substituir ListView:

  1. Não há onItemClickListener () para a seleção de itens da lista - solução

  2. Sem divisão entre itens da lista - solução

  3. Não há seletor de sobreposição embutido, não há feedback visual quando você clica no item da lista - solução

  4. Não addHeaderView para cabeçalho da lista - solução

Talvez mais problemas ...

Portanto, quando usamos RecyclerViewa substituição ListView, precisamos fazer muita codificação extra para alcançar o mesmo efeito que ListView.

QUESTÃO:

  • Vale a pena substituí-lo ListViewpor RecyclerViewtotalmente?
  • se não, então nesse caso, devemos utilizar melhor RecyclerViewao invés ListView, e vice-versa?
Xcihnegn
fonte
9
seu segmento é apenas o primeiro problema, e não é a minha pergunta
Xcihnegn
3
Apenas mencione que você deve usar uma visualização de reciclagem se estiver interessado em usar uma barra de ação recolhida. medium.com/android-bites/…
francas
você deve usar a recyclerview porque oferece mais controle do que o listview. É um pouco complexo, mas como você chega lá, sua vida será super fácil sempre que você estiver lidando com coisas do tipo lista.
Sadashiv
3
melhor é o inimigo do bem.
oldergod

Respostas:

118

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 RecyclerView é poderoso quando você precisa personalizar sua lista ou deseja animações melhores. Esses métodos de conveniência no ListView causaram muitos problemas para as pessoas, e é por isso que o RecyclerView fornece uma solução mais flexível para elas.

A principal mudança que você precisa fazer para a migração está no seu adaptador. Se você deseja continuar ligando notifyDataSetChanged, perde a maioria dos benefícios de animação e encadernação. Mas se você puder alterar seu adaptador para enviar eventos de notificação detalhados (adicionados / removidos / movidos / atualizados), obterá animações e desempenho muito melhores. Esses eventos permitem ao RecyclerView escolher animações corretas e também ajudam a evitar onBindchamadas desnecessárias . Você obterá um grande benefício se as visualizações dos seus itens forem complexas. Além disso, daqui para frente, haverá mais componentes no RecyclerView.

yigit
fonte
2
Se eu pudesse lhe dar 100 votos positivos, eu daria. O notifyDataSetChanged()método estava fazendo com que eu RecyclerViewcontinuasse pedindo novas ViewHolderso tempo todo, estripando os benefícios do ViewHolderpadrão. Procurando a solução, encontrei seu comentário que responde muito bem ao meu problema: D obrigado!
de aspiração Dev
Não concordo "Você obterá um enorme benefício se as visualizações dos seus itens forem complexas", tenho o recyclerView no qual o adaptador possui 3, caso contrário, o Recyclerview apresenta um desempenho ruim no meu caso. Eu tive que desativar a reciclagem usando isRecyclable(false);e o resultado final é muito lento, o RecyclerView. Eu não posso mesmo mudar isso, vai demorar muito tempo para voltar a listview :(
kashyap jimuliya
4
as pessoas usam RV sem muitos outros tipos, sem nenhum problema e bom desempenho. Há algo mais errado no seu código. Você deve usar o systrace / traceview e ver o que está acontecendo.
yigit 31/08/16
1
@kashyapjimuliya como yigit mencionado, 3 if-else não deve causar isso. Em primeiro lugar, você não mencionou onde colocou esses if-else; segundo, desativar a reciclagem deve torná-la mais lenta e mais rápida. Por quê? Porque inflar uma visão e fazer findViewById()é muito caro do que fazê-lo da ViewHoldermaneira.
Sufian
24

De acordo com mim, se o ListView atender a todas as necessidades atuais do seu aplicativo e atender a todos os casos de uso, não será necessário substituí-lo por um RecyclerView.

O RecyclerView fornece enorme poder a seus desenvolvedores, com o custo de aumentar a complexidade para os desenvolvedores. Há certas coisas que poderiam ser feitas facilmente em um ListView agora podem exigir muito esforço desnecessário.

Mas sim, há muitas coisas que um ListView nunca pode fazer, como o incrível recurso LayoutManager, que permite alterar dinamicamente o layout para horizontal, vertical, grade ou grade escalonada sem problemas.

Eu escrevi uma resposta detalhada sobre este tópico aqui .

Aritra Roy
fonte
3
Certamente, o RecyclerView aumenta a complexidade, mas pelo menos implementa o padrão ViewHolder corretamente para você.
IgorGanapolsky
@IgorGanapolsky +1 para a implementação do padrão ViewHolder.
Sreekanth Karumanaghat
você pode escrever seu próprio padrão de suporte de exibição muito bem com um ListView
dan
9

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.

Então, se a eficiência é a sua preocupação, então sim , é uma boa idéia para substituir um ListView com um RecyclerView.

Phantômaxx
fonte
19
Estas não são as minhas perguntas, eu tive link para cada solução de problema
Xcihnegn
6

Até recentemente, eu ainda estava usando o ListView para listas muito simples. Por exemplo, se eu quiser exibir uma lista simples de opções de texto ...

Baseei essa decisão em 'fatores humanos', que criar um ListView simples com menos código é melhor se o desempenho for irrelevante. Costumo pensar em um professor da faculdade que gostava de dizer: "Meu professor, o grande Niclaus Wirth, o inventor de Pascal, costumava dizer que se um programa tem mais de 50 linhas de código, com certeza está errado ..."

Mas o que me convenceu a parar de usar o ListView é que ele foi recentemente movido para a categoria "Legado" na ferramenta de design do Android Studio, juntamente com o RelativeLayout.

https://developer.android.com/reference/android/widget/ListView

Eu acho que essa é uma forma 'suave' de 'depreciação'. Seria muito perturbador se fosse realmente preterido e todos os desenvolvedores conscientes mudassem seu código para o RecyclerView.

Além disso, a introdução ao ListView adverte logo no topo que o RecyclerView é uma opção melhor: "Para uma abordagem mais moderna, flexível e de alto desempenho da exibição de listas, use o RecyclerView".
https://developer.android.com/reference/android/widget/ListView

Além disso, o guia do ListView ainda está falando sobre carregadores de cursor, mas o próprio getSupportCursorLoader () acabou de ser preterido na API 28.
https://developer.android.com/guide/topics/ui/layout/listview

Aprimoramentos recentes no Android Studio:

Arquivo -> Novo -> Fragmento -> Fragmento (lista)

Isso nos dá um RecylerView totalmente funcional preenchido com texto básico. Isso acaba com o meu último motivo real para usar o ListView, porque agora é tão fácil configurar um RecylerView básico.

Em resumo, não pretendo usar o ListView para novos desenvolvimentos, porque rotulá-lo como 'legado' está a um passo de desvalorizá-lo.

Elletlar
fonte
3

O único caso em que ainda é bom usar o ListView é quando a lista não é dinâmica ou é afetada por eventos de rede. Por exemplo: navegação.

Para outros usos, o RecyclerView ofusca o ListView. Como o RecyclerView se preocupa apenas com a reciclagem, será mais fácil fazer coisas visuais relacionadas com o ListView, como mudar de posição / rearranjo, animação (na verdade, ele vem com o RecyclerView.ItemAnimator), layouts personalizados (o estoque possui o StaggeredGrid, além de a lista antiga ou o estilo da grade, mas também há essa biblioteca que a amplia ainda mais).

Além disso, se você quiser usar o CardView, acredito que seja o único caminho a percorrer (uma boa leitura quando usar o cartão ou a lista).

inmyth
fonte
Você está se referindo a pegar uma lista de dados dos servidores e, em seguida, armazenados no sqlite no telefone para serem usados ​​em uma exibição de lista (digamos seus seguidores), é melhor usar uma exibição de reciclagem do que uma exibição de lista com um suporte de exibição ?
precisa saber é
Sim. Mas, para ser mais preciso, não vejo mais nenhuma função do ListView, exceto a navegação, e acho que é um exagero usar o RecyclerView lá.
inmyth
2

Uma ótima alternativa é usar o BaseAdapter. Ele suporta o uso do padrão Viewholder e o meu contém mais de 100 linhas com bitmaps e botões, além de ser muito suave.

grantespo
fonte