Como usar o RecyclerView dentro do NestedScrollView?

210

Como usar RecyclerViewdentro NestedScrollView? RecyclerViewo 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>
Mecid
fonte
@Mecid Não há motivos para usar um RecyclerView dentro de um ScrollView (ou NestedScrollView).
Gabriele Mariotti
2
@Mecid, você nunca deve colocar uma exibição rolável dentro de outra exibição rolável. É uma regra geral no Android.
Gabriele Mariotti
6
@GabrieleMariotti conheço essa regra, mas o NestedScrollView foi desenvolvido para corrigir esse problema.
Mecid
1
Não está correto. NestedScrollView é como o ScrollView, mas ele suporta atuar como pai e filho com rolagem aninhada. No seu caso, você deve definir seu próprio comportamento de rolagem.
Gabriele Mariotti

Respostas:

216

Substitua seu recyclerView por,

<android.support.v7.widget.RecyclerView
    android:id="@+id/conversation"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />

aqui,

app:layout_behavior="@string/appbar_scrolling_view_behavior"

irá gerenciar o resto das coisas.

Mais uma coisa, não há necessidade de colocar o seu recicladorView dentro do NestedScrollView

Rahul Upadhyay
fonte
33
Não consigo entender por que essa solução não recebe mais votos. Não é conseguido com, NestedScrollViewmas apenas com app:layout_behavior="@string/appbar_scrolling_view_behavior". Essa é a chave!
hata
3
@RahulUpadhyay isso funcionou para mim, mas acho que sua última linha está errada, o RecyclerView não aparece se estiver dentro de um NestedScrollView. No entanto, você é uma estrela: D
Leon
3
Funciona! basta atualizar a biblioteca de reciclagem, compile 'com.android.support:recyclerview-v7:+'
Fabio Guerra
28
Esta solução deve ser usada com CoordinatorLayout, AppBarLayoute com a configuração apropriada layout_scrollFlagsna (s) visão (s) filho (s) que devem ser roladas com o RecyclerView. Não sei por que isso foi omitido na resposta. Caso contrário, esta é uma solução agradável e simples.
Sanvywell
9
Eu acho que é muito importante entender que a RECICLAGEM do RecyclerView não funcionará aqui. Como resultado, se você tiver uma lista longa de itens, eles aparecerão com um congelamento perceptível na interface do usuário.
Gaket
121

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:

    LayoutManager layoutManager = new LinearLayoutManager(this);
    layoutManager.setAutoMeasureEnabled(true);
    recyclerView.setLayoutManager(layoutManager);
    recyclerView.setNestedScrollingEnabled(false);


ATUALIZAÇÃO 2

Como o 27.1.0 setAutoMeasureEnabledestá 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 RecyclerViewdentro NestedScrollView. Antes de tudo, você deve implementar seu próprio costume LinearLayoutManager, pois ele RecyclerViewenvolve seu conteúdo. Por exemplo:

public class WrappingLinearLayoutManager extends LinearLayoutManager
{

    public WrappingLinearLayoutManager(Context context) {
        super(context);
    }

    private int[] mMeasuredDimension = new int[2];

    @Override
    public boolean canScrollVertically() {
        return false;
    }

    @Override
    public void onMeasure(RecyclerView.Recycler recycler, RecyclerView.State state,
            int widthSpec, int heightSpec) {
        final int widthMode = View.MeasureSpec.getMode(widthSpec);
        final int heightMode = View.MeasureSpec.getMode(heightSpec);

        final int widthSize = View.MeasureSpec.getSize(widthSpec);
        final int heightSize = View.MeasureSpec.getSize(heightSpec);

        int width = 0;
        int height = 0;
        for (int i = 0; i < getItemCount(); i++) {
            if (getOrientation() == HORIZONTAL) {
                measureScrapChild(recycler, i,
                        View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED),
                        heightSpec,
                        mMeasuredDimension);

                width = width + mMeasuredDimension[0];
                if (i == 0) {
                    height = mMeasuredDimension[1];
                }
            } else {
                measureScrapChild(recycler, i,
                        widthSpec,
                        View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED),
                        mMeasuredDimension);

                height = height + mMeasuredDimension[1];
                if (i == 0) {
                    width = mMeasuredDimension[0];
                }
            }
        }

        switch (widthMode) {
            case View.MeasureSpec.EXACTLY:
                width = widthSize;
            case View.MeasureSpec.AT_MOST:
            case View.MeasureSpec.UNSPECIFIED:
        }

        switch (heightMode) {
            case View.MeasureSpec.EXACTLY:
                height = heightSize;
            case View.MeasureSpec.AT_MOST:
            case View.MeasureSpec.UNSPECIFIED:
        }

        setMeasuredDimension(width, height);
    }

    private void measureScrapChild(RecyclerView.Recycler recycler, int position, int widthSpec,
            int heightSpec, int[] measuredDimension) {

        View view = recycler.getViewForPosition(position);
        if (view.getVisibility() == View.GONE) {
            measuredDimension[0] = 0;
            measuredDimension[1] = 0;
            return;
        }
        // For adding Item Decor Insets to view
        super.measureChildWithMargins(view, 0, 0);
        RecyclerView.LayoutParams p = (RecyclerView.LayoutParams) view.getLayoutParams();
        int childWidthSpec = ViewGroup.getChildMeasureSpec(
                widthSpec,
                getPaddingLeft() + getPaddingRight() + getDecoratedLeft(view) + getDecoratedRight(view),
                p.width);
        int childHeightSpec = ViewGroup.getChildMeasureSpec(
                heightSpec,
                getPaddingTop() + getPaddingBottom() + getDecoratedTop(view) + getDecoratedBottom(view),
                p.height);
        view.measure(childWidthSpec, childHeightSpec);

        // Get decorated measurements
        measuredDimension[0] = getDecoratedMeasuredWidth(view) + p.leftMargin + p.rightMargin;
        measuredDimension[1] = getDecoratedMeasuredHeight(view) + p.bottomMargin + p.topMargin;
        recycler.recycleView(view);
    }
}

Depois disso, use isso LayoutManagerpara o seuRecyclerView

recyclerView.setLayoutManager(new WrappingLinearLayoutManager(getContext()));

Mas você também deve chamar esses dois métodos:

recyclerView.setNestedScrollingEnabled(false);
recyclerView.setHasFixedSize(false);

setNestedScrollingEnabled(false)Desative aqui a rolagem para RecyclerViewque não intercepte o evento de rolagem NestedScrollView. E setHasFixedSize(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, RecyclerViewrecomendo usar a LinearLayoutimplementação personalizada da exibição de lista, crie um análogo do Adapter e faça com que comportar-se como ListViewouRecyclerView

smbd uknow
fonte
19
Cuidado! Não use isso se você tiver muitos itens no seu RecyclerView.
Brais Gabin
1
@BraisGabin, você está certo: setHasFixedSize (false) causa várias atualizações do RecyclerView; portanto, se houver muitos itens, funcionará muito lentamente. Nesses casos eu uso LinearLayout com uma espécie de costume "adaptador" para ele para torná-lo comportar-se como ListView ou RecyclerView
SMBD Uknow
1
Muito obrigado! Me salvou horas. A propósito, a última decoração do item não é exibida com este gerenciador de layout (e apenas com este), possível bug?
Jjang 6/11
2
setAutoMeasureEnabled foi descontinuado no nível da API 27.1.0 developer.android.com/reference/android/support/v7/widget/…
Dika:
2
substitua o booleano isAutoMeasureEnabled (). Retorna se o passo de medição do layout deve usar o mecanismo AutoMeasure do RecyclerView ou se deve ser feito pela implementação do onMeasure do LayoutManager (Recycler, State, int, int). Esse método retorna false por padrão (na verdade, retorna o valor passado para o setAutoMeasureEnabled (booleano) obsoleto) e deve ser substituído para retornar true se um LayoutManager quiser ser medido automaticamente pelo RecyclerView. Se esse método for substituído para retornar true, onMeasure (Recycler, State, int, int) não deverá ser substituído.
Peterstev Uremgba
100

1) Você precisa usar a biblioteca de suporte 23.2.0 (ou) acima

2) e RecyclerViewaltura 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_contentprecisam da altura de conclusão, de RecyclerViewmodo que serão desenhadas todas as Views at once. No view will be recycled). Try not to use this pattern unless it is really required. Try to useview filhoType and add all other views that need to scroll toRecyclerView rather than usingRecyclerView inScrollview`. O impacto no desempenho será muito alto.

Para simplificar, "ele age como LinearLayoutem todas as visualizações filho"

Ashok Varma
fonte
6
Obrigado @Ashok. A configuração recyclerView.setNestedScrollingEnabled(false)me ajudou a ter uma rolagem suave.
Shubhral
3
Essa deve ser a resposta aceita! faça com que seja bem salientado que Nenhuma vista será reciclada e toda a vista será desenhada de uma só vez.
M'hamed
3
@AshokVarma, mesmo problema que estou enfrentando agora. mas o scroll está funcionando bem dentro do recyclerView, mas eu não pude implementar o Endless scroll for recyclerview porque todas as visualizações do recyclerview são desenhadas de uma só vez, o que leva a continuar chamando o serviço web. Então, como posso lidar com isso?
Anantha Babu
@AnanthaBabu em vez de usar a visualização de reciclagem em uma visualização de rolagem. converta todos os itens na exibição de rolagem em itens na exibição do reciclador. você pode usar o tipo de exibição de visualizações de reciclagem e pintar diferentes tipos de layouts. Também existem algumas boas bibliotecas para lidar com elas (use bibliotecas se você tiver uma estrutura de exibição realmente complicada e se desejar componentes reutilizáveis).
Ashok Varma
1
@AshokVarma existe alguma solução para o problema de comportamento do reciclador? Não quero que a reciclagem recorte todas as crianças de uma só vez.
andro-girl
36

Você pode usar android:fillViewport="true"para NestedScrollViewmedir o RecyclerView. O RecyclerViewpreenchimento da altura restante. então se você quiser para rolar a NestScrollView, você pode definir as RecyclerView's minHeight.

zayn
fonte
14
se você tiver uma revisão de 200 itens e fizer isso, o nestedscrollview será expandido para preencher os 200 itens inteiros!
RJFares
1
@RJFares Isso nunca aconteceu. Eu tento uma demonstração e uso o LayoutInspector para inspecionar o layout, ele apenas funciona bem. Você pode fornecer as versões do seu recyclerView?
Zayn
26

Simplesmente adicionar recyclerView.setNestedScrollingEnabled(false);antes de setAdaptersi funcionou para mim. Não adicionei app:layout_behavior="@string/appbar_scrolling_view_behavior"nenhum lugar e não defini nenhum gerenciador de layout personalizado

<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:background="@color/white"
        android:orientation="vertical">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginLeft="15dp"
            android:layout_marginRight="15dp"
            android:orientation="vertical">

            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:textColor="@color/white"
                android:text="Some Text..."
                android:padding="15dp" />

        </LinearLayout>

        <LinearLayout
            android:orientation="vertical"
            android:padding="15dp"
            android:layout_marginTop="10dp"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="Quick Links"
                android:textColor="@color/black"
                android:textStyle="bold"
                android:textAllCaps="true"
                android:paddingLeft="20dp"
                android:drawableLeft="@drawable/ic_trending_up_black_24dp"
                android:drawablePadding="10dp"
                android:layout_marginBottom="10dp"
                android:textSize="16sp"/>

            <View
                android:layout_width="fill_parent"
                android:layout_height="1dp"
                android:background="#efefef"/>

            <android.support.v7.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android"
                android:id="@+id/recyclerview"
                android:layout_width="match_parent"
                android:layout_height="match_parent" />
        </LinearLayout>

    </LinearLayout>

</android.support.v4.widget.NestedScrollView>
Vignesh Sundar
fonte
10
Mas agora ele não recicla visualizações mais?
Mark-Buikema
Não, vai reciclar, não é?
Vignesh Sundar
6
Não, tentei, com um layout muito complexo, com 200 itens, que o nestedscrollview apenas se expande para o tamanho de seus filhos, para que ele se expanda; portanto, nenhuma reciclagem acontecerá. @ MarkBuikema você conseguiu encontrar uma solução melhor?
RJFares
20

É isso que funciona para mim

<android.support.v4.widget.NestedScrollView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fillViewport="true"
    app:layout_behavior="@string/appbar_scrolling_view_behavior">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/rv_recycler_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"/>
</android.support.v4.widget.NestedScrollView>
Ness Tyagi
fonte
4
Você pode remover o segundo aplicativo: layout_behavior = "@ string / appbar_scrolling_view_behavior" Como o comportamento só funciona para filhos diretos do CoordinatorLayout.
Pepster 16/08/16
2
Além disso, é importante mencionar que você deve ter o layout do coordenador como layout raiz. Nem sempre é verdade.
Gaket
10

Existe um código simples e de teste que você pode verificar

<android.support.v4.widget.NestedScrollView
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:fillViewport="true"
     app:layout_behavior="@string/appbar_scrolling_view_behavior">
    <android.support.v7.widget.RecyclerView
           android:layout_width="match_parent"
           android:layout_height="match_parent"/>
   </android.support.v4.widget.NestedScrollView>
Hakim Khan
fonte
9

Pois androidxé chamado androidx.core.widget.NestedScrollView- e também rola manteiga com propriedades isScrollContainere measureAllChildrenativado:

<!-- Scrolling Content -->
<androidx.core.widget.NestedScrollView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"

    android:isScrollContainer="true"
    android:measureAllChildren="true"

    app:layout_behavior="@string/appbar_scrolling_view_behavior">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recyclerview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fastScrollEnabled="true"
        android:scrollbarStyle="insideInset"
        android:scrollbars="vertical"
        android:splitMotionEvents="false"
        android:verticalScrollbarPosition="right"/>

</androidx.core.widget.NestedScrollView>
Martin Zeitler
fonte
7

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".

alcsan
fonte
1
Esta é a classe do LinearLayoutManager desta biblioteca: github.com/serso/android-linear-layout-manager/blob/master/lib/…
Ninja Coding
6

Aqui está o código que estou usando para evitar problemas de rolagem:

mRecyclerView = (RecyclerView) view.findViewById(android.R.id.list);
mRecyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
mRecyclerView.getLayoutManager().setAutoMeasureEnabled(true);
mRecyclerView.setNestedScrollingEnabled(false);
mRecyclerView.setHasFixedSize(false);
Anton Tananaev
fonte
6

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

Felix Otoo
fonte
5

Eu tenho o Viewpager e o RecyclerView dentro do NestedScrollView. Depois de adicionar as linhas abaixo

recyclerView.setNestedScrollingEnabled(false);
recyclerView.setHasFixedSize(false);

Resolvi o problema de rolagem lenta e lag de rolagem.

Isham
fonte
3
Você não quer dizer recyclerView.setHasFixedSize(true);?
Keno Clayton #
3

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.

Barry Irvine
fonte
8
Desde RecyclerViewimplementos NestedScrollingChild, RecyclerViewdeve poder ser rolado via NestedScrollView.
Benjamin
Eu apenas votei para rejeitar o stackoverflow.com/review/suggested-edits/9907622 baseado puramente nos erros em inglês, mas pode haver conteúdo de valor lá - qualquer pessoa que passe com conhecimento do assunto deve dar uma olhada e ver se eles pode limpá-lo. Se não houver nada útil lá, sinalize este meu comentário para exclusão pelos mods.
Mark Amery
3

Se você estiver usando RecyclerView-23.2.1ou mais tarde. A solução a seguir funcionará bem:

No seu layout, adicione o RecyclerView assim:

<android.support.v7.widget.RecyclerView
        android:id="@+id/review_list"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:scrollbars="vertical" />

E no seu arquivo java:

RecyclerView mRecyclerView = (RecyclerView) view.findViewById(R.id.recyclerView);
LinearLayoutManager layoutManager=new LinearLayoutManager(getContext());
layoutManager.setAutoMeasureEnabled(true);
mRecyclerView.setLayoutManager(layoutManager);
mRecyclerView.setHasFixedSize(true);
mRecyclerView.setAdapter(new YourListAdapter(getContext()));

Aqui layoutManager.setAutoMeasureEnabled(true); vai fazer o truque.

Confira esta edição e este blog do desenvolvedor para obter mais informações.

uniruddh
fonte
Cuidado ao usar "mRecyclerView.setHasFixedSize (true);" Apesar. Você pode usá-lo apenas se não adicionar ou remover itens da exibição do reciclador em tempo de execução.
Gaket
2

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.

Christian Callelero
fonte
2

Há muitas boas respostas. A chave é que você deve definir nestedScrollingEnabledcomo false. Como mencionado acima, você pode fazê-lo no código java:

mRecyclerView.setNestedScrollingEnabled(false);

Mas você também tem a oportunidade de definir a mesma propriedade no código xml ( android:nestedScrollingEnabled="false"):

 <android.support.v7.widget.RecyclerView
 android:id="@+id/recyclerview"
 android:nestedScrollingEnabled="false"
 android:layout_width="match_parent"
 android:layout_height="match_parent" />
Alex Misiulia
fonte
2

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.

recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
        @Override
        public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
            super.onScrollStateChanged(recyclerView, newState); 
              ......
        }
    });

esse código está funcionando bem com o RecyclerView ScrollListener dentro do NestedScrollView .

obrigado

Rahul
fonte
1

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.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

        <android.support.v7.widget.RecyclerView
            android:id="@+id/rv_nearby"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:layout_behavior="@string/appbar_scrolling_view_behavior" />

</RelativeLayout>
Bogdan Ustyak
fonte
1

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.

Hossein Karami
fonte
1
nestedScrollView.setNestedScrollingEnabled(true);

mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
        @Override
        public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
            super.onScrolled(recyclerView, dx, dy);
            //...
        }
    });


<androidx.core.widget.NestedScrollView
    android:id="@+id/nested"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fillViewport="true"
    android:layout_below="@id/appBarLayout_orders"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"> 

    <androidx.constraintlayout.widget.ConstraintLayout ...

        <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/recycler"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"/>
Braian Coronel
fonte
0

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 NestedRecyclerViewinterior de qualquer pacote, digamos utils em seu projeto, depois basta criar sua visão de reciclagem como

 <com.your_package.utils.NestedRecyclerView
      android:id="@+id/rv_test"
      android:layout_width="match_parent"
      android:layout_height="match_parent" />

Confira este artigo incrível de Marc Knaup

https://medium.com/widgetlabs-engineering/scrollable-nestedscrollviews-inside-recyclerview-ca65050d828a

Gastón Saillén
fonte
0

Solução para não carregar todos os filhos de recyclew view de uma só vez na exibição de rolagem aninhada .

Benefícios:

  1. não carrega todos os filhos uma vez, ao usar a exibição de rolagem aninhada.
  2. você pode usar recycleView.setHasFixedSize (true) para obter melhor desempenho
  3. Para impedir que os serviços da Web enviem todos os dados de uma só vez, a paginação funciona conforme o esperado
  4. bom para um número maior de conjuntos de dados.
  5. bom para dispositivos com pouca memória
  6. pode continuar usando rolagem aninhada
  7. muito útil quando o seu estilo de exibição de itens é complexo e requer muitos recursos.

Consertar :

no seu xml, em vez de usar match_parent ou wrap_content para revisão de reciclagem, use a altura da correção .

Abhishek Garg
fonte
-5

RecyclerView com NestedScrollView

    <android.support.v7.widget.RecyclerView
    android:id="@+id/rv"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior" />
devangi chhatbar
fonte