O que developer.android.com está falando sobre o RecyclerView

Saudações, querido harazhiteli! Este post me levou a escrever um artigo (ou melhor, a sensação de um aumento acentuado da temperatura local na área ... hmm, região lombar, o que geralmente ocorre quando alguém está errado na Internet).


Vamos começar do começo. Concordo plenamente que "há algo em comum entre o ciclo de vida da atividade e o trabalho do RecyclerView" - isso é "algo" - a necessidade de entender o que estamos fazendo e por quê. E leia a documentação. E o fracasso em cumprir essas duas necessidades, como o sonho da razão, dá origem a monstros. Somente aqui, com a maneira como o autor anterior se oferece para combater esses monstros, discordo totalmente.


Considere 2 condições.


Nº da condição vezes


Se você desligar um ouvinte em algum lugar, desconecte-o. Geralmente eles fazem isso em funções simétricas - anexam ao onViewAttachedToWindow , remova-o ao onViewDetachedFromWindow . Nós anexamos onBindViewHolder ... Nós não anexamos onBindViewHolder . Esta chamada não é simétrica, pode ser chamada várias vezes, dependendo das diferentes condições. Não há necessidade de complicar sua vida.


Se você, como o autor do artigo original, pensa: “Mas há casos em que ... no ouvinte é necessário levar em consideração a posição do elemento na lista, cujo acesso está disponível no método onBindViewHolder () e está ausente no onViewAttachedToWindow ()" , em seguida, dirija isso pensou fora. Você não pode fazer isso. Mesmo se você realmente quiser. Conforme declarado na documentação , esse método não será chamado se apenas a posição do elemento tiver sido alterada, mas não seu conteúdo, portanto, corremos o risco de obter a posição errada em nosso ouvinte. Use getAdapterPosition .


Condição número dois


RecyclerView é uma coisa bastante complicada. Não há necessidade de complicar ainda mais sua vida. Se você não está envolvido na otimização de desempenho, não deve importar se esse elemento está no pool geral ou não.


Resultado


Sob essas duas condições, é improvável que você precise reinventar a roda na forma de um sinalizador viewWasRecycled .


O que está havendo?


O que pode acontecer com um elemento no RecyclerView em geral? Primeiro, lembre-se de que existem 2 "repositórios" - cache e pool. Um elemento entra no cache se ultrapassou os limites da tela, mas pode retornar novamente a qualquer momento - sem mesmo vincular novamente esse elemento (ou seja, o método onBindViewHolder não será chamado). Se o cache estiver cheio, ou por algum outro motivo, o RecyclerView decidiu que não precisamos desse elemento em um futuro próximo, ele irá para o pool (aqui será chamado onViewRecycled ). O item recuperado do pool será vinculado novamente (porque provavelmente sua posição foi alterada) e receberemos uma chamada onBindViewHolder . Mas se o elemento saiu do pool, o novo elemento passará por todo o ciclo - onCreateViewHolder , onBindViewHolder , onViewAttachedToWindow .


Total, temos 3 opções para o desenvolvimento de eventos:


  • não havia elemento antes: criamos, anexamos, anexamos;
  • o item estava no conjunto: vincular, anexar;
  • o item estava no cache: basta anexar.

Onde e como


O que e em que estágios é melhor fazer com um elemento?


  • onCreateViewHolder . Crie, hmm, ViewHolder . Não há necessidade de vincular um ouvinte, preenchê-lo com conteúdo etc. Basta determinar de que tipo precisamos e criá-lo.
  • onBindViewHolder . Realizamos a ligação do conteúdo real - texto, imagens. O parâmetro position pode ser usado apenas no próprio método - não o salvamos, não o enviamos aos fechamentos, lembramos que esse método será chamado novamente se os dados forem alterados (e não será feito se apenas a posição for alterada). Também não penduraria um ouvinte aqui - por razões de simetria.
  • onViewAttachedToWindow . O elemento agora estará visível na tela, o usuário poderá interagir com ele - um bom momento para anexar um ouvinte. Lembre-se de que, se precisamos da posição de um elemento dentro dele, obtemos isso através de getAdapterPosition .
  • onViewDetachedFromWindow . O item não será exibido na tela. O usuário não poderá interagir com ele. Remova o ouvinte.
  • onViewRecycled . O item é enviado para inferno piscina Aqui você pode liberar recursos pesados ​​(fotos em cache, por exemplo). Se o elemento for reutilizado - então, provavelmente, para uma posição diferente.

Isso parece ser tudo. Espero não ter esquecido nada ou misturado nada, mas se alguma coisa, cutucar o nariz, não seja tímido.

Source: https://habr.com/ru/post/pt430812/


All Articles