Quero expandir / recolher os itens do meu recyclerView para mostrar mais informações. Desejo obter o mesmo efeito do SlideExpandableListView .
Basicamente, no meu viewHolder, tenho uma visualização que não é visível e quero fazer uma animação suave de expansão / recolhimento, em vez de definir a visibilidade como VISÍVEL / EXTREMAMENTE. Eu só preciso que um item seja expandido por vez e seria legal ter alguma elevação para mostrar que o item está selecionado.
É o mesmo efeito da nova lista de histórico de chamadas recentes do Android. As opções "LIGAR DE VOLTA" e "DETALHES" são visíveis apenas quando um item é selecionado.
Respostas:
Não use nenhuma biblioteca para esse efeito. Em vez disso, use a maneira recomendada de fazê-lo, de acordo com as E / S do Google. No método onBindViewHolder do seu recyclerView, faça o seguinte:
E para os efeitos interessantes que você queria, use-os como seus atributos list_item:
onde comment_background é:
e comment_selection é:
fonte
TransitionManager.beginDelayedTransition(recyclerView);
caso eu não consiga ter a referência de exibição do reciclador.recyclerView
como um parâmetro no construtor para o adaptadorPara isso, só eram necessárias linhas simples, não complicadas
no seu método onBindViewHolder, adicione o código abaixo
Para aqueles que querem apenas um item expandido e outros são recolhidos. Usa isto
primeiro declare uma variável global com previousExpandedPosition = -1
então
Feito!!!. Simples e humilde .. :)
fonte
OnClickListener
s aonCreateViewHolder
vez deonBindViewHolder
RecyclerView
trabalho, ou seja, qual é o objetivo doLayoutManager
contrário, se ele não gerencia os layouts! Esta solução é melhor que a solução votada, pois possui menos código, permiteRecyclerView
lidar com as coisas e funciona melhor!Não estou dizendo que essa é a melhor abordagem, mas parece funcionar para mim.
O código completo pode ser encontrado em: Exemplo de código em: https://github.com/dbleicher/recyclerview-grid-quickreturn
Primeiro, adicione a área expandida ao layout da célula / item e torne o layout da célula anexa animateLayoutChanges = "true". Isso garantirá que a expansão / recolhimento seja animada:
Em seguida, faça a sua classe RV Adapter implementar View.OnClickListener para que você possa atuar no item que está sendo clicado. Adicione um campo int para manter a posição da visualização expandida e inicialize-a com um valor negativo:
Por fim, implemente os métodos ViewHolder, onBindViewHolder () e substitua o método onClick (). Você expandirá a exibição no onBindViewHolder se sua posição for igual a "extendedPosition" e ocultará se não. Você define o valor de extendedPosition no ouvinte onClick:
Isso deve expandir apenas um item de cada vez, usando a animação padrão do sistema para a alteração do layout. Pelo menos funciona para mim. Espero que ajude.
fonte
expandAlarm
A função emAlarmClockFragment.java
arquivos executa a parte de expansão.onClick()
devo substituir? Não háonClick
no adaptador.Existe uma biblioteca muito simples de usar com suporte a gradle: https://github.com/cachapa/ExpandableLayout .
Diretamente dos documentos da biblioteca:
Depois de marcar seus expansíveis vista, basta ligar para qualquer um destes métodos no recipiente:
expand()
,collapse()
outoggle()
fonte
Sei que já faz muito tempo que a pergunta original foi publicada. Mas acho que para os mais lentos como eu, um pouco de explicação da resposta de @ Heisenberg ajudaria.
Declare duas variáveis na classe do adaptador como
Em seguida, em onBindViewHolder, conforme indicado na resposta original.
E, por último, para obter o objeto recyclerView na substituição do adaptador
Espero que isto ajude.
fonte
Simplesmente não há necessidade de usar bibliotecas de terceiros. Um pequeno ajuste no método demonstrado no Google I / O 2016 e Heisenberg neste tópico, faz o truque.
Uma vez que
notifyDataSetChanged()
redesenha o completoRecyclerView
,notifyDataItemChanged()
é uma opção melhor (não a melhor) porque temos a posição e aViewHolder
disposição enotifyDataItemChanged()
apenas redesenha o particularViewHolder
em uma determinada posição .Mas o problema é que o desaparecimento prematuro do
ViewHolder
clique e seu surgimento não são eliminados, mesmo quenotifyDataItemChanged()
sejam utilizados.O código a seguir não recorrer a
notifyDataSetChanged()
ounotifyDataItemChanged()
e é testado em API 23 e funciona como um encanto quando usado em uma RecyclerView onde cada ViewHolder tem umCardView
como do elemento raiz:prev_position
é um número inteiro global inicializado com -1.details
é a visualização completa que é mostrada quando expandida e oculta quando recolhida.Como dito, o elemento raiz de
ViewHolder
é umCardView
comforeground
estateListAnimator
atributos definidos exatamente como dito por Heisenberg neste tópico.ATUALIZAÇÃO: A demonstração acima reduzirá o item previamente expandido se um deles estiver expandido. Para modificar esse comportamento e manter o item expandido como ele é, mesmo quando outro item for expandido, você precisará do código a seguir.
ATUALIZAÇÃO: ao expandir os últimos itens da lista, ele pode não ser totalmente visível porque a parte expandida fica abaixo da tela. Para obter o item completo na tela, use o seguinte código.
IMPORTANTE: Para que as demonstrações acima funcionem, é necessário manter em seu código uma instância do RecyclerView e do LayoutManager (o posterior para flexibilidade)
fonte
notifyItemChanged
porque tenho umaImageView
imagem que carrega de um URL.notifyItemChanged
recarregar minha imagem a faz parecer estranhoTransitionManager.beginDelayedTransition(recycler);
, ótimo achado. Mas descobri que, usando esse método, se eu clicar em várias linhas com spam sequencialmente, ele eventualmente acionará uma falha internaThe specified child already has a parent. You must call removeView() on the child's parent first
. Imagino que isso se deva à reciclagem da vista nos limites da vista da recicladora, mas não tenho certeza. Alguém teve o mesmo problema?Depois de usar a maneira recomendada de implementar itens expansíveis / recolhíveis que residem em itens de expansão / recolhimento
RecyclerView
no RecyclerView respondidos por HeisenBerg , eu vi alguns artefatos visíveis sempre que aRecyclerView
atualização foi feita invocandoTransitionManager.beginDelayedTransition(ViewGroup)
e subseqüentementenotifyDatasetChanged()
.Sua resposta original:
Modificado:
int
aquele que controla o item expandidoViewHolder
usado durante o recolhimento do itemObserve que o método
TransitionManager.beginDelayedTransition(ViewGroup)
enotifyDataSetChanged()
é substituído pornotifyItemChanged(int)
para direcionar item específico e alguns pequenos ajustes.Após a modificação, os efeitos indesejados anteriores devem desaparecer. No entanto, essa pode não ser a solução perfeita. Ele só fez o que eu queria, eliminando os problemas.
::EDITAR::
Para esclarecimento, ambos
mExpandedPosition
emExpandedHolder
são globais.fonte
notifyItemChanged()
. Você pode animar e alterar manualmente a altura do item e adicionar visualizações a ele.Faça o seguinte depois de definir o ouvinte onClick para a classe ViewHolder:
Eu acho que isso deve ajudar, é assim que eu implementei e faço o mesmo google na visualização de chamadas recente.
fonte
Estou surpreso que ainda não haja uma resposta concisa, embora uma animação de expansão / recolhimento seja muito fácil de obter com apenas 2 linhas de código:
junto com
Então, para mim, as explicações no link abaixo foram realmente úteis: https://medium.com/@nikola.jakshic/how-to-expand-collapse-items-in-recyclerview-49a648a403a6
fonte
fonte
Use dois tipos de exibição no seu
RVAdapter
. Um para layout expandido e outro para recolhido. E a mágica acontece com a configuraçãoandroid:animateLayoutChanges="true"
para o GoogleRecyclerView
Checkout do efeito alcançado usando isso às 0:42 neste vídeofonte