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, ListView
pode fazer tudo o que precede, se a eficiência não importa, e encontramos muitos problemas quando usamos RecyclerView
para substituir ListView
:
Não há onItemClickListener () para a seleção de itens da lista - solução
Sem divisão entre itens da lista - solução
Não há seletor de sobreposição embutido, não há feedback visual quando você clica no item da lista - solução
Não addHeaderView para cabeçalho da lista - solução
Talvez mais problemas ...
Portanto, quando usamos RecyclerView
a substituição ListView
, precisamos fazer muita codificação extra para alcançar o mesmo efeito que ListView
.
QUESTÃO:
- Vale a pena substituí-lo
ListView
porRecyclerView
totalmente?- se não, então nesse caso, devemos utilizar melhor
RecyclerView
ao invésListView
, e vice-versa?
fonte
Respostas:
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 evitaronBind
chamadas 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.fonte
notifyDataSetChanged()
método estava fazendo com que euRecyclerView
continuasse pedindo novasViewHolders
o tempo todo, estripando os benefícios doViewHolder
padrão. Procurando a solução, encontrei seu comentário que responde muito bem ao meu problema: D obrigado!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 :(findViewById()
é muito caro do que fazê-lo daViewHolder
maneira.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 .
fonte
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.
fonte
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.
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:
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.
fonte
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).
fonte
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.
fonte