Estou tentando implementar um layout que contém RecyclerView e ScrollView no mesmo layout.
Modelo de layout:
<RelativeLayout>
<ScrollView android:id="@+id/myScrollView">
<unrelated data>...</unrealated data>
<android.support.v7.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/my_recycler_view"
/>
</ScrollView>
</RelativeLayout>
Problemas: eu posso rolar até o último elemento de ScrollView
Coisas que tentei:
- visualização do cartão dentro de
ScrollView
(agoraScrollView
contémRecyclerView
) - pode ver o cartão até oRecyclerView
- O pensamento inicial era implementar isso
viewGroup
usando emRecyclerView
vez deScrollView
onde um de seus modos de exibição é o,CardView
mas eu tenho exatamente os mesmos resultados que com oScrollView
NestedScrollView
em vez disso, como ele lida com uma série de questões de rolagemNestedScrollView
vez de aScrollView
. É exatamente para isso que serve.Respostas:
use em
NestedScrollView
vez deScrollView
Consulte o documento de referência NestedScrollView para obter mais informações.
e adicione
recyclerView.setNestedScrollingEnabled(false);
ao seuRecyclerView
fonte
android:layout_height="wrap_content"
para o layout inflado para ViewHolderNestedScrollView
fica para mim, ao contrário doScrollView
. Procura de uma solução sem usarNestedScrollView
Sei que estou atrasado no jogo, mas o problema ainda existe mesmo depois que o Google corrigiu o problema.
android.support.v7.widget.RecyclerView
A questão eu recebo agora é
RecyclerView
comlayout_height=wrap_content
não tomar altura de toda a questão itens dentroScrollView
que única acontece em versões Marshmallow e Nougat + (API 23, 24, 25).(ATUALIZAÇÃO: Substituindo
ScrollView
porandroid.support.v4.widget.NestedScrollView
obras em todas as versões. De alguma forma, perdi o teste da solução aceita . Adicionei isso no meu projeto do github como demonstração.)Depois de tentar coisas diferentes, encontrei uma solução alternativa que corrige esse problema.
Aqui está minha estrutura de layout em poucas palavras:
A solução alternativa é o wrap the
RecyclerView
withRelativeLayout
. Não me pergunte como encontrei essa solução alternativa !!!¯\_(ツ)_/¯
Exemplo completo está disponível no projeto GitHub - https://github.com/amardeshbd/android-recycler-view-wrap-content
Aqui está um screencast de demonstração mostrando a correção em ação:
fonte
Embora a recomendação de que
É um bom conselho, no entanto, se você definir uma altura fixa na exibição da recicladora, ela deverá funcionar bem.
Se você conhece a altura do layout do item do adaptador, basta calcular a altura do RecyclerView.
fonte
adapterItemSize
variável?Caso a configuração de altura fixa para o RecyclerView não funcione para alguém (como eu), eis o que eu adicionei à solução de altura fixa:
fonte
A nova Biblioteca de suporte Android 23.2 resolve esse problema. Agora você pode definir wrap_content como a sua altura
RecyclerView
e funcionar corretamente.Biblioteca de suporte do Android 23.2
fonte
RecyclerViews é bom para colocar em ScrollViews, desde que não estejam rolando eles mesmos. Nesse caso, faz sentido torná-lo uma altura fixa.
A solução adequada é usar
wrap_content
na altura do RecyclerView e implementar um LinearLayoutManager personalizado que possa lidar adequadamente com o empacotamento.Copie este LinearLayoutManager para o seu projeto: https://github.com/serso/android-linear-layout-manager/blob/master/lib/src/main/java/org/solovyev/android/views/llm/LinearLayoutManager.java
Em seguida, envolva o RecyclerView:
E configure-o assim:
Editar: Isso pode causar complicações com a rolagem, porque o RecyclerView pode roubar os eventos de toque do ScrollView. Minha solução foi apenas abandonar o RecyclerView em todos e usar um LinearLayout, inflar programaticamente sub-visualizações e adicioná-las ao layout.
fonte
Para
ScrollView
, você pode usarfillViewport=true
e fazerlayout_height="match_parent"
como abaixo e colocar a visão do reciclador dentro:Nenhum outro ajuste de altura é necessário através do código.
fonte
Calcular
RecyclerView
a altura manualmente não é bom, melhor é usar um costumeLayoutManager
.A razão para emissão acima é qualquer ponto de vista que tem de rolagem (
ListView
,GridView
,RecyclerView
) falhou para o seu cálculo de altura quando add como uma criança em uma outra visão tem de rolagem. Portanto, substituir seuonMeasure
método resolverá o problema.Substitua o gerenciador de layout padrão pelo seguinte:
fonte
Tente isso. Resposta muito tarde. Mas certamente ajude alguém no futuro.
Defina seu Scrollview como NestedScrollView
Na sua visão de reciclagem
fonte
UPDATE: esta resposta está desatualizada agora, pois existem widgets como NestedScrollView e RecyclerView que oferecem suporte à rolagem aninhada.
você nunca deve colocar uma exibição rolável dentro de outra exibição rolável!
Eu sugiro que você faça sua exibição principal do reciclador de layout e coloque suas visualizações como itens da exibição do reciclador.
dê uma olhada neste exemplo, que mostra como usar várias visualizações no adaptador de exibição do reciclador. link para exemplo
fonte
Se você colocar
RecyclerView
dentroNestedScrollView
e ativarrecyclerView.setNestedScrollingEnabled(false);
, a rolagem funcionará bem .No entanto, há um problema
Por exemplo, seu
RecyclerView
(internoNestedScrollView
ouScrollView
) possui 100 itens.Ao
Activity
iniciar, serão criados 100 itens (onCreateViewHolder
eonBindViewHolder
100 itens serão chamados ao mesmo tempo).Exemplo, para cada item, você carregará uma imagem grande da API => atividade criada -> 100 imagens serão carregadas.
Torna a atividade inicial lenta e atrasada.
Solução possível :
- Pensando em usar
RecyclerView
com vários tipos.No entanto, se no seu caso, houver apenas alguns itens dentro
RecyclerView
e reciclar ou não reciclar não afetam muito o desempenho, você pode usá-loRecyclerView
dentroScrollView
parafonte
RecyclerView
reciclar depois de colocá-loScrollView
. Se você quiser reciclar, pensando em outra abordagem (como usar RecyclerView com o tipo múltipla)Você pode usar desta maneira:
Adicione esta linha à sua visualização xml do recyclerView:
experimente, a reciclagem será rolada suavemente com altura flexível
espero que isso tenha ajudado.
fonte
Parece que
NestedScrollView
resolve o problema. Eu testei usando este layout:E funciona sem problemas
fonte
Usei o CustomLayoutManager para desativar a rolagem do RecyclerView. Também não use o Recycler View como WrapContent, use-o como 0dp, Weight = 1
Use CustomLayoutManager no RecyclerView:
XML da interface do usuário:
fonte
Eu estava tendo o mesmo problema. Isso é o que eu tentei e funciona. Estou compartilhando meu código xml e java. Espero que isso ajude alguém.
Aqui está o xml
Aqui está o código java relacionado. Ele funciona como um encanto.
fonte
NestedScrollView
em vez de vista de rolagemIsso faz o truque:
fonte
Na verdade, o principal objetivo do
RecyclerView
é compensarListView
eScrollView
. Em vez de fazer o que você está realmente fazendo: ter umRecyclerView
em umScrollView
, sugiro ter apenas umRecyclerView
que possa lidar com muitos tipos de crianças.fonte
Primeiro você deve usar em
NestedScrollView
vez deScrollView
colocar oRecyclerView
interiorNestedScrollView
.Use a classe de layout personalizado para medir a altura e a largura da tela:
E implemente o código abaixo na atividade / fragmento de
RecyclerView
:fonte
Se o RecyclerView mostrar apenas uma linha dentro do ScrollView. Você só precisa definir a altura da sua linha para
android:layout_height="wrap_content"
.fonte
você também pode substituir o LinearLayoutManager para fazer a visualização da reciclagem rolar suavemente
fonte
Desculpe chegar atrasado à festa, mas parece que existe outra solução que funciona perfeitamente para o caso que você mencionou.
Se você usar uma exibição de reciclador dentro de uma exibição de reciclador, ela parece funcionar perfeitamente bem. Eu pessoalmente tentei e o usei, e parece não dar lentidão nem agitação. Agora não tenho certeza se essa é uma boa prática ou não, mas, ao aninhar várias visualizações do reciclador, até a visualização de rolagem aninhada diminui. Mas isso parece funcionar bem. Por favor, tente. Tenho certeza de que o aninhamento vai ficar perfeitamente bem com isso.
fonte
Outra abordagem para resolver o problema é usar o
ConstraintLayout
interiorScrollView
:Mas eu ainda continuaria com a
androidx.core.widget.NestedScrollView
abordagem proposta por Yang Peiyong .fonte
** Solução que funcionou para mim
Use NestedScrollView com altura como wrap_content
// O conteúdo da sua linha entra aqui
fonte