Como usar RecyclerView
dentro NestedScrollView
?
RecyclerView
o conteúdo não é visível após a configuração do adaptador.
UPDATE código de layout atualizado.
<android.support.v4.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="@dimen/keyline_1">
</RelativeLayout>
<View
android:id="@+id/separator"
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="#e5e5e5" />
<android.support.v7.widget.RecyclerView
android:id="@+id/conversation"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
</android.support.v4.widget.NestedScrollView>
android
android-recyclerview
Mecid
fonte
fonte
Respostas:
Substitua seu recyclerView por,
aqui,
irá gerenciar o resto das coisas.
Mais uma coisa, não há necessidade de colocar o seu recicladorView dentro do NestedScrollView
fonte
NestedScrollView
mas apenas comapp:layout_behavior="@string/appbar_scrolling_view_behavior"
. Essa é a chave!CoordinatorLayout
,AppBarLayout
e com a configuração apropriadalayout_scrollFlags
na (s) visão (s) filho (s) que devem ser roladas com oRecyclerView
. Não sei por que isso foi omitido na resposta. Caso contrário, esta é uma solução agradável e simples.ATUALIZAÇÃO 1
Desde a Biblioteca de suporte Android 23.2.0, foi adicionado um método
setAutoMeasureEnabled(true)
para o LayoutManagers. Faz o RecyclerView envolver seu conteúdo e funciona como um encanto.http://android-developers.blogspot.ru/2016/02/android-support-library-232.html
Então, basta adicionar algo como isto:
ATUALIZAÇÃO 2
Como o 27.1.0
setAutoMeasureEnabled
está obsoleto, você deve fornecer a implementação personalizada do LayoutManager com o método substituídoisAutoMeasureEnabled()
Porém, após muitos casos de uso do RecyclerView, recomendo vivamente não usá-lo no modo de agrupamento , pois não é para isso que ele se destina. Tente refatorar todo o seu layout usando o RecyclerView único normal com vários tipos de itens. Ou use a abordagem com LinearLayout que descrevi abaixo como último recurso
Resposta antiga (não recomendada)
Você pode usar
RecyclerView
dentroNestedScrollView
. Antes de tudo, você deve implementar seu próprio costumeLinearLayoutManager
, pois eleRecyclerView
envolve seu conteúdo. Por exemplo:Depois disso, use isso
LayoutManager
para o seuRecyclerView
Mas você também deve chamar esses dois métodos:
setNestedScrollingEnabled(false)
Desative aqui a rolagem paraRecyclerView
que não intercepte o evento de rolagemNestedScrollView
. EsetHasFixedSize(false)
determine que as alterações no conteúdo do adaptador podem alterar o tamanho doRecyclerView
Nota importante: Em alguns casos, esta solução é pouco problemática e tem problemas de desempenho; portanto, se você tiver muitos itens,
RecyclerView
recomendo usar aLinearLayout
implementação personalizada da exibição de lista, crie um análogo do Adapter e faça com que comportar-se comoListView
ouRecyclerView
fonte
RecyclerView
.1) Você precisa usar a biblioteca de suporte 23.2.0 (ou) acima
2) e
RecyclerView
altura seráwrap_content
.3)
recyclerView.setNestedScrollingEnabled(false)
Mas, ao fazer isso, o padrão do reciclador não funciona . (ou seja, todas as visualizações serão carregadas de uma só vez, pois
wrap_content
precisam da altura de conclusão, deRecyclerView
modo que serão desenhadas todas asViews at once. No view will be recycled). Try not to use this pattern unless it is really required. Try to use
view filhoTypeand add all other views that need to scroll to
RecyclerViewrather than using
RecyclerViewin
Scrollview`. O impacto no desempenho será muito alto.Para simplificar, "ele age como
LinearLayout
em todas as visualizações filho"fonte
recyclerView.setNestedScrollingEnabled(false)
me ajudou a ter uma rolagem suave.Você pode usar
android:fillViewport="true"
paraNestedScrollView
medir oRecyclerView
. ORecyclerView
preenchimento da altura restante. então se você quiser para rolar aNestScrollView
, você pode definir asRecyclerView
'sminHeight
.fonte
Simplesmente adicionar
recyclerView.setNestedScrollingEnabled(false);
antes desetAdapter
si funcionou para mim. Não adicioneiapp:layout_behavior="@string/appbar_scrolling_view_behavior"
nenhum lugar e não defini nenhum gerenciador de layout personalizadofonte
É isso que funciona para mim
fonte
Existe um código simples e de teste que você pode verificar
fonte
Pois
androidx
é chamadoandroidx.core.widget.NestedScrollView
- e também rola manteiga com propriedadesisScrollContainer
emeasureAllChildren
ativado:fonte
Tente usar esta biblioteca - https://github.com/serso/android-linear-layout-manager .
O LayoutManager da biblioteca faz com que o RecyclerView agrupe seu conteúdo. Nesse caso, o RecyclerView será "tão grande quanto as vistas internas", portanto não terá barras de rolagem e o usuário usará as habilidades de rolagem do NestedScrollView. Portanto, não será ambíguo como "rolável dentro de rolagem".
fonte
Aqui está o código que estou usando para evitar problemas de rolagem:
fonte
Eu usei o RecyclerView dentro de um NestedScrollView e funcionou para mim. O único problema que eu tinha que ter em mente era que um NestedScrollView usa apenas uma visão filho. Portanto, no meu caso, usei o grupo de visualizações LienearLayout, que abrigava meu RecyclerView, além de várias outras visualizações necessárias.
Ocorreu um problema ao colocar meu RecyclerView dentro do NestedScrollView. Percebi que a rolagem do conteúdo do meu RecyclerView estava frouxa.
Mais tarde, percebi que meu RecyclerView estava recebendo o evento de rolagem e, portanto, estava em conflito com o comportamento de rolagem do NestedScrollView.
Então, para resolver esse problema, tive que desativar a funcionalidade de rolagem do meu RecyclerView com esse método
movieListNewRecyclerView.setNestedScrollingEnabled(false);
Você pode conferir meu Instagram para um pequeno vídeo do que eu realmente fiz. Esta é a minha alça instagram ofelix03
Clique nesta imagem para ver o que eu fiz
fonte
Eu tenho o Viewpager e o RecyclerView dentro do NestedScrollView. Depois de adicionar as linhas abaixo
Resolvi o problema de rolagem lenta e lag de rolagem.
fonte
recyclerView.setHasFixedSize(true);
?Você não pode usar uma exibição de reciclagem dentro de uma exibição de rolagem aninhada. Ele não pretende conter outras visualizações roláveis, mas é porque é filho de um layout de rolagem que você precisa da exibição de rolagem aninhada. Eu tive o mesmo problema, mas, no final, mudei minha visualização de texto para ser uma visão frontal dentro da reciclagem, tornei a reciclagem um filho direto do layout do coordenador e excluí a exibição de rolagem aninhada. Então todos os meus problemas se foram.
fonte
RecyclerView
implementosNestedScrollingChild
,RecyclerView
deve poder ser rolado viaNestedScrollView
.Se você estiver usando
RecyclerView-23.2.1
ou mais tarde. A solução a seguir funcionará bem:No seu layout, adicione o RecyclerView assim:
E no seu arquivo java:
Aqui
layoutManager.setAutoMeasureEnabled(true);
vai fazer o truque.Confira esta edição e este blog do desenvolvedor para obter mais informações.
fonte
Uma solução para manter o recurso de reciclagem da vista da reciclagem e evitar que a vista da carga carregue todos os seus dados é definir uma altura de correção na própria vista da reciclagem. Ao fazer isso, a reciclagem é limitada apenas ao carregamento, pois sua altura pode mostrar ao usuário reciclando seu elemento, se você rolar para a parte inferior / superior.
fonte
Há muitas boas respostas. A chave é que você deve definir
nestedScrollingEnabled
comofalse
. Como mencionado acima, você pode fazê-lo no código java:Mas você também tem a oportunidade de definir a mesma propriedade no código xml (
android:nestedScrollingEnabled="false"
):fonte
Se você estiver usando o RecyclerView ScrollListener dentro do NestedScrollView , o ouvinte addOnScrollListener não funcionará corretamente se você usar os dois.
Use este código.
esse código está funcionando bem com o RecyclerView ScrollListener dentro do NestedScrollView .
obrigado
fonte
Eu tive que implementar o CoordinatorLayout com a rolagem da barra de ferramentas e demorei o dia todo brincando com isso. Eu tenho que trabalhar removendo o NestedScrollView. Então, eu estou apenas usando RelativeLayout na raiz.
fonte
não use recyclerView dentro do NestedScrollView. isso pode causar problemas em cascata! Sugiro usar ItemViewTypes no RecyclerView para lidar com vários tipos de visualizações. basta adicionar um RecyclerView com largura e altura do match_parent. em seu recyclerViewAdapter, substitua getItemViewType e use position para lidar com o layout a ser inflado. Depois disso, você poderá lidar com o seu detentor da visualização usando o método onBindViewHolder.
fonte
fonte
Eu usei esta incrível extensão (escrita em kotlin, mas também pode ser usada em Java)
https://github.com/Widgetlabs/expedition-nestedscrollview
Basicamente, você obtém o
NestedRecyclerView
interior de qualquer pacote, digamos utils em seu projeto, depois basta criar sua visão de reciclagem comoConfira este artigo incrível de Marc Knaup
https://medium.com/widgetlabs-engineering/scrollable-nestedscrollviews-inside-recyclerview-ca65050d828a
fonte
Benefícios:
Consertar :
fonte
RecyclerView com NestedScrollView
fonte