Estou tendo problemas para entender setHasFixedSize()
. Eu sei que ele é usado para otimização quando o tamanho de RecyclerView
não muda, a partir dos documentos.
O que isso significa? Nos casos mais comuns, um ListView
quase sempre tem um tamanho fixo. Em que casos não seria um tamanho fixo? Isso significa que o espaço real que ocupa na tela cresce com o conteúdo?
android
android-5.0-lollipop
android-recyclerview
SIr Codealot
fonte
fonte
Respostas:
Uma versão muito simplificada do RecyclerView possui:
Este link descreve por que as chamadas
requestLayout
podem ser caras. Basicamente, sempre que os itens são inseridos, movidos ou removidos, o tamanho (largura e altura) do RecyclerView pode mudar e, por sua vez, o tamanho de qualquer outra exibição na hierarquia da exibição. Isso é particularmente problemático se itens forem adicionados ou removidos com frequência.Evite passes de layout desnecessários, definindo
setHasFixedSize
como true quando a alteração do conteúdo do adaptador não altera sua altura ou largura.Atualização: O JavaDoc foi atualizado para descrever melhor o que o método realmente faz.
fonte
requestLayout
ou não após a atualização do dataSet.Pode confirmar
setHasFixedSize
se refere ao próprio RecyclerView, e não ao tamanho de cada item adaptado a ele.Agora você pode usar
android:layout_height="wrap_content"
um RecyclerView, que, entre outras coisas, permite que um CollapsingToolbarLayout saiba que ele não deve recolher quando o RecyclerView estiver vazio. Isso funciona apenas quando você usasetHasFixedSize(false)
o RecylcerView.Se você usar
setHasFixedSize(true)
no RecyclerView, esse comportamento para impedir o CollapsingToolbarLayout de colapsar não funcionará, mesmo que o RecyclerView esteja realmente vazio.Se estiver
setHasFixedSize
relacionado ao tamanho dos itens, não deverá ter efeito quando o RecyclerView não tiver itens.fonte
setHasFixedSize(true)
-los para expandi-los quando novos itens forem adicionados.hasFixedSize: set to true if adapter changes cannot affect the size of the RecyclerView.
mesmo que o tamanho do item seja alterado, você ainda pode configurá-lo como verdadeiro.O ListView tinha uma função nomeada semelhante que, na minha opinião, refletia informações sobre o tamanho das alturas individuais dos itens da lista. A documentação do RecyclerView afirma claramente que se refere ao tamanho do RecyclerView em si, não ao tamanho de seus itens.
No comentário de origem RecyclerView acima do método setHasFixedSize ():
fonte
Wen vamos definir
setHasFixedSize(true)
emRecyclerView
que os meios tamanho do reciclador é fixo e não é afetada pelo conteúdo do adaptador. E, neste caso,onLayout
não é chamado de reciclador quando atualizamos os dados do adaptador (mas há uma exceção).Vamos ao exemplo:
RecyclerView
possuiRecyclerViewDataObserver
( encontre a implementação padrão neste arquivo ) com vários métodos, o principal importante é:Este método é chamado se definir
setHasFixedSize(true)
e atualizar dados de um adaptador via:notifyItemRangeChanged, notifyItemRangeInserted, notifyItemRangeRemoved or notifyItemRangeMoved
. Nesse caso, não há chamadas para o recicladoronLayout
, mas há chamadas pararequestLayout
a atualização de crianças.Porém, se definirmos
setHasFixedSize(true)
e atualizarmos os dados de um adaptador vianotifyItemChanged
, haverá uma chamada paraonChange
o padrão do recicladorRecyclerViewDataObserver
e nenhuma chamada paratriggerUpdateProcessor
. Nesse caso, o recicladoronLayout
é chamado sempre que definirmossetHasFixedSize
true
oufalse
.Como verificar sozinho:
Crie personalizado
RecyclerView
e substitua:Defina o tamanho da recicladora para
match_parent
(em xml). Tente atualizar os dados do adaptador usandoreplaceData
ereplaceOne
com a configuraçãosetHasFixedSize(true)
e, em seguidafalse
.E verifique seu log.
Meu log:
Resumir:
Se definirmos
setHasFixedSize(true)
e atualizarmos os dados do adaptador notificando um observador de outra maneira que não a chamadanotifyDataSetChanged
, você terá algum desempenho, porque não há chamadas para oonLayout
método recycler .fonte
Se tivermos um
RecyclerView
commatch_parent
as height / width , devemos adicionar,setHasFixedSize(true)
pois o tamanho doRecyclerView
mesmo não altera a inserção ou exclusão de itens nele.setHasFixedSize deve ser falsa, se temos um RecyclerView com
wrap_content
a altura / largura , pois cada elemento inserido pelo adaptador pode mudar o tamanho doRecycler
dependendo dos itens inseridos / excluídos, por isso, o tamanho daRecycler
será diferente cada vez que adicionar / excluir Itens.Para ser mais claro, se usarmos
Podemos usar
my_recycler_view.setHasFixedSize(true)
Devemos usar
my_recycler_view.setHasFixedSize(false)
, isso se aplica também se usarmoswrap_content
como largurafonte
setHasFixedSize (true) significa que o RecyclerView possui filhos (itens) com largura e altura fixas. Isso permite que o RecyclerView otimize melhor descobrindo a altura e a largura exatas de toda a lista com base no seu adaptador.
fonte
Afeta as animações da visão de reciclagem, se for
false
.. as animações de inserção e remoção não serão exibidas. portanto, verifique setrue
você adicionou animação para a revisão de reciclagem.fonte
Se o tamanho do RecyclerView (o próprio RecyclerView)
... não depende do conteúdo do adaptador:
... depende do conteúdo do adaptador:
fonte