Jak korzystać z RecyclerView w NestedScrollView?


210

Jak korzystać z RecyclerViewwnętrza NestedScrollView? RecyclerViewzawartość nie jest widoczna po ustawieniu adaptera.

Zaktualizowano kod układu UPDATE .

<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 Nie ma powodów, aby używać RecyclerView wewnątrz ScrollView (lub NestedScrollView).
Gabriele Mariotti

2
@Mecid nigdy nie należy umieszczać przewijanego widoku w innym przewijalnym widoku. Jest to ogólna zasada w Androidzie.
Gabriele Mariotti

6
@GrrieleMariotti Znam tę zasadę, ale NestedScrollView opracował, aby rozwiązać ten problem.
Mecid

1
To jest niepoprawne. NestedScrollView jest podobny do ScrollView, ale obsługuje zarówno przewijanie zagnieżdżone jako rodzic i dziecko. W twoim przypadku musisz zdefiniować własne zachowanie podczas przewijania.
Gabriele Mariotti

Odpowiedzi:


216

Zamień swój recyklerView na,

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

tutaj,

app:layout_behavior="@string/appbar_scrolling_view_behavior"

zajmie się resztą rzeczy.

Jeszcze jedno: nie musisz umieszczać swojego recyclinglerView w NestedScrollView


33
Nie rozumiem, dlaczego to rozwiązanie nie ma największej liczby głosów. Nie można tego osiągnąć, NestedScrollViewale tylko z app:layout_behavior="@string/appbar_scrolling_view_behavior". To jest klucz!
hata

3
@RahulUpadhyay to działało dla mnie, ale myślę, że twoja ostatnia linia jest błędna, RecyclerView nie pokazuje się wcale, jeśli jest w NestedScrollView. Jesteś jednak supergwiazdą: D
Leon

3
To działa! wystarczy zaktualizować bibliotekę recyclinglerview skompiluj „com.android.support:recyclerview-v7:+”
Fabio Guerra

28
To rozwiązanie jest przeznaczone do użycia z CoordinatorLayout, AppBarLayouti odpowiednie ustawienie layout_scrollFlagsw widokach potomnych, które powinny być przewijane za pomocą RecyclerView. Nie jestem pewien, dlaczego zostało to pominięte w odpowiedzi. W przeciwnym razie jest to miłe i proste rozwiązanie.
Sanvywell

9
Myślę, że bardzo ważne jest, aby zrozumieć, że RECYKLING RecyclerView NIE DZIAŁA tutaj. W rezultacie, jeśli masz długą listę przedmiotów, pojawi się z zauważalnym zamrożeniem interfejsu użytkownika.
Gaket

121

AKTUALIZACJA 1

Od Android Support Library 23.2.0 dodano metodę setAutoMeasureEnabled(true)dla LayoutManagers. To sprawia, że ​​RecyclerView zawija zawartość i działa jak urok.
http://android-developers.blogspot.ru/2016/02/android-support-library-232.html

Dodaj więc coś takiego:

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


AKTUALIZACJA 2

Ponieważ 27.1.0 setAutoMeasureEnabledjest przestarzałe, należy zapewnić niestandardową implementację LayoutManager z przesłoniętą metodąisAutoMeasureEnabled()

Ale po wielu przypadkach użycia RecyclerView zdecydowanie nie zaleca się używania go w trybie owijania , ponieważ nie jest to przeznaczone do tego celu. Spróbuj przefiltrować cały układ za pomocą zwykłego pojedynczego RecyclerView z kilkoma typami przedmiotów. Lub użyj podejścia z LinearLayout, które opisałem poniżej jako ostateczność


Stara odpowiedź (niezalecana)

Możesz użyć w RecyclerViewśrodku NestedScrollView. Przede wszystkim powinieneś wdrożyć własny niestandardowy LinearLayoutManager, który powoduje RecyclerViewzawinięcie jego zawartości. Na przykład:

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);
    }
}

Następnie użyj tego LayoutManagerdla swojegoRecyclerView

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

Ale powinieneś także wywołać te dwie metody:

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

Tutaj setNestedScrollingEnabled(false)wyłącz przewijanie dla RecyclerView, aby nie przechwytywał zdarzenia przewijania NestedScrollView. I setHasFixedSize(false)ustal, że zmiany w treści adaptera mogą zmienić rozmiar plikuRecyclerView

Ważna uwaga: w niektórych przypadkach to rozwiązanie jest trochę wadliwe i ma problemy z wydajnością, więc jeśli masz wiele elementów RecyclerView, polecam skorzystanie z niestandardowej LinearLayoutimplementacji widoku listy, stwórz dla niego analog i adapter. zachowuj się jak ListViewlubRecyclerView


19
Uwaga! Nie używaj tego, jeśli masz dużo przedmiotów RecyclerView.
Brais Gabin

1
@BraisGabin, masz rację: setHasFixedSize (false) powoduje wielokrotne odświeżanie RecyclerView, więc jeśli zawiera wiele elementów, będzie działał bardzo wolno. W takich przypadkach używam LinearLayout z rodzajem niestandardowego „adaptera”, aby
działał

1
Wielkie dzięki! Oszczędził mi godziny. Nawiasem mówiąc, ostatnia dekoracja przedmiotu nie jest wyświetlana w tym menedżerze układu (i tylko w tym), możliwy błąd?
Jjang,

2
setAutoMeasureEnabled jest przestarzałe od poziomu API 27.1.0 developer.android.com/reference/android/support/v7/widget/...
Dika

2
zastąpienie boolean isAutoMeasureEnabled () zamiast tego. Zwraca, czy pomiarowe przejście układu powinno korzystać z mechanizmu AutoMeasure RecyclerView, czy też powinno być wykonane przez implementację onMeasure (Recycler, State, int, int) przez LayoutManager. Ta metoda domyślnie zwraca false (w rzeczywistości zwraca wartość przekazaną do przestarzałego setAutoMeasureEnabled (boolean)) i powinna zostać przesłonięta, aby zwrócić true, jeśli LayoutManager chce być automatycznie mierzony przez RecyclerView. Jeśli ta metoda zostanie zastąpiona w celu zwrócenia wartości true, nie należy przesłonić metody onMeasure (Recycler, State, int, int).
Peterstev Uremgba

100

1) Musisz użyć biblioteki wsparcia 23.2.0 (lub) powyżej

2) i RecyclerViewwysokość będzie wrap_content.

3) recyclerView.setNestedScrollingEnabled(false)

Ale w ten sposób wzorzec recyklera nie działa . (tzn. wszystkie widoki zostaną załadowane jednocześnie, ponieważ wrap_contentwymaga wysokości zakończenia, RecyclerViewaby narysować wszystkie elementy potomne Views at once. No view will be recycled). Try not to use this pattern unless it is really required. Try to useviewType and add all other views that need to scroll toRecyclerView rather than usingRecyclerView inScrollview`. Wpływ na wydajność będzie bardzo wysoki.

Upraszczając: „działa tak samo jak LinearLayoutwszystkie widoki dziecka”


6
Dzięki @Ashok. Ustawienie recyclerView.setNestedScrollingEnabled(false)pomogło mi płynnie przewijać.
Shubhral

3
To powinna być zaakceptowana odpowiedź! ponieważ dobrze wskazuje, że żaden widok nie zostanie przetworzony, a cały widok zostanie narysowany jednocześnie.
M'hamed,

3
@AshokVarma, ten sam problem, z którym się teraz spotykam. ale przewijanie działa dobrze w recyclinglerView, ale nie mogłem zaimplementować Endless scroll dla recyclinglerview, ponieważ wszystkie widoki rysunków recyclerview naraz, więc prowadzi to do dalszego wywoływania usługi internetowej. więc jak sobie z tym poradzić?
Anantha Babu

@AnanthaBabu zamiast korzystania z recyclinglerview w scrollview. przekonwertuj wszystkie elementy w widoku przewijania na elementy w widoku recyklera. możesz używać typu widoku recyclinglerviews i malować różne rodzaje układów. Są też dobre biblioteki do obsługi tych bibliotek (użyj bibliotek, jeśli masz naprawdę skomplikowaną strukturę widoku i jeśli chcesz komponentów wielokrotnego użytku).
Ashok Varma

1
@AshokVarma czy istnieje jakieś rozwiązanie problemu związanego z recyklingiem? Nie chcę, żeby recyklerview narysował wszystkie dzieci jednym strzałem.
andro-girl

36

Możesz użyć, android:fillViewport="true"aby NestedScrollViewzmierzyć RecyclerView. RecyclerViewWypełni pozostałą wysokość. więc jeśli chcesz, aby przewinąć NestScrollView, można ustawić RecyclerView„s minHeight.


14
jeśli masz recykler 200 elementów i robisz to, zagnieżdżony widok przewijania rozszerzy się, aby wypełnić całe 200 elementów!
RJFares

1
@RJFares To się nigdy nie zdarzyło. Próbuję wersji demo i używam LayoutInspector do sprawdzenia układu, po prostu działa dobrze. Czy możesz dostarczyć wersje swojego recyclinglerView?
zayn

26

Po prostu dodanie recyclerView.setNestedScrollingEnabled(false);przed setAdaptersobą działało dla mnie. app:layout_behavior="@string/appbar_scrolling_view_behavior"Nigdzie nie dodałem i nie ustawiłem żadnego niestandardowego menedżera układu

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

10
Ale teraz nie przetwarza już widoków?
Mark Buikema

Nie, będzie przetwarzać, prawda?
Vignesh Sundar

6
nie, nie, próbowałem z bardzo złożonym układem z 200 elementami, których widok zagnieżdżony powiększa się do rozmiarów swoich dzieci, więc będzie się powiększał, dlatego nie będzie recyklingu @MarkBuikema udało ci się znaleźć lepsze rozwiązanie?
RJFares

20

To działa dla mnie

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

4
Możesz usunąć drugą aplikację: layout_behavior = "@ string / appbar_scrolling_view_behavior" Ponieważ zachowanie działa tylko dla bezpośrednich potomków CoordinatorLayout.
Pepster,

2
Ponadto należy wspomnieć, że układ koordynatora powinien mieć układ główny. Nie zawsze jest to prawda.
Gaket

10

Istnieje prosty i testujący kod, który możesz sprawdzić

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

9

Na androidxto się nazywa androidx.core.widget.NestedScrollView- i to też przewija alike masło z właściwościami isScrollContaineri measureAllChildrenwłączona:

<!-- 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>

7

Spróbuj użyć tej biblioteki - https://github.com/serso/android-linear-layout-manager .

LayoutManager biblioteki sprawia, że ​​RecyclerView zawija swoją zawartość. W takim przypadku RecyclerView będzie „tak duży jak widoki wewnętrzne”, więc nie będzie miał pasków przewijania, a użytkownik użyje zdolności przewijania NestedScrollView. Dlatego nie będzie dwuznaczny jak „przewijany wewnątrz przewijalny”.


1
To jest klasa LinearLayoutManager z tej biblioteki: github.com/serso/android-linear-layout-manager/blob/master/lib/...
Ninja Coding

6

Oto kod, którego używam, aby uniknąć problemów z przewijaniem:

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

6

Użyłem RecyclerView wewnątrz NestedScrollView i zadziałało to dla mnie. Jedyne, co musiałem pamiętać, to że NestedScrollView ma tylko jeden widok potomny. Tak więc w moim przypadku skorzystałem z grupy widokowej LienearLayout, która mieściła mój RecyclerView oraz kilka innych widoków, których potrzebowałem.

Występuje jeden problem z umieszczeniem mojego RecyclerView w NestedScrollView. Uświadomiłem sobie, że przewijanie zawartości mojego RecyclerView zwolniło.

Później zdałem sobie sprawę, że mój RecyclerView odbiera zdarzenie przewijania i dlatego jest w konflikcie z zachowaniem przewijania NestedScrollView.

Aby rozwiązać ten problem, musiałem wyłączyć funkcję przewijania mojego RecyclerView za pomocą tej metody movieListNewRecyclerView.setNestedScrollingEnabled(false);

Możesz sprawdzić mój Instagram, aby zobaczyć krótki film z tego, co faktycznie zrobiłem. To jest mój uchwyt Instagram ofelix03

Kliknij ten obraz, aby zobaczyć, co zrobiłem


5

Mam Viewpager i RecyclerView wewnątrz NestedScrollView. Po dodaniu poniżej wierszy

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

Rozwiązałem problem wolnego przewijania i opóźnienia przewijania.


3
Nie masz na myśli recyclerView.setHasFixedSize(true);?
Keno Clayton

3

Nie można użyć widoku recyklera w zagnieżdżonym widoku przewijania. Nie ma on zawierać dalszych przewijalnych widoków, ale ponieważ jest to potomek samego przewijanego układu, potrzebujesz zagnieżdżonego widoku przewijania. Miałem ten sam problem, ale ostatecznie przeniosłem mój tekst na widok nagłówka w widoku recyclinglerview, uczyniłem recyclinglerview bezpośrednim potomkiem układu koordynatora i usunąłem zagnieżdżony widok przewijania. Potem wszystkie moje problemy zniknęły.


8
Ponieważ RecyclerViewnarzędzia NestedScrollingChild, RecyclerViewpowinny być możliwe do przewijania NestedScrollView.
Benjamin

Właśnie głosowałem za odrzuceniem stackoverflow.com/review/suggested-edits/9907622 na podstawie czysto angielskich błędów, ale może tam być treść o wartości - każdy przechodzący ze znajomością tematu powinien się przyjrzeć i sprawdzić, czy mogę to posprzątać. Jeśli nie ma tam nic przydatnego, oflaguj ten mój komentarz do usunięcia przez modów.
Mark Amery

3

Jeśli używasz RecyclerView-23.2.1lub później. Następujące rozwiązanie będzie działać dobrze:

W swoim układzie dodaj RecyclerView w następujący sposób:

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

A w twoim pliku 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()));

Tutaj layoutManager.setAutoMeasureEnabled(true);załatwi sprawę.

Sprawdź ten problem i blog programisty, aby uzyskać więcej informacji.


Zachowaj ostrożność, używając „mRecyclerView.setHasFixedSize (true);” chociaż. Możesz go używać tylko wtedy, gdy nie dodajesz ani nie usuwasz elementów z widoku recyklera w czasie wykonywania.
Gaket

2

Jednym z rozwiązań, które pozwala zachować funkcję recyklingu w widoku recyklera i uniknąć ładowania podglądu w celu załadowania wszystkich danych, jest ustawienie stałej wysokości w samym widoku recyklingu. W ten sposób widok recyklera ogranicza się tylko do załadowania takiej wysokości, jaką może pokazać użytkownik, a zatem recykling elementu, jeśli przewiniesz do dołu / góry.


2

Istnieje wiele dobrych odpowiedzi. Kluczem jest to, że trzeba ustawić nestedScrollingEnabledsię false. Jak wspomniano powyżej, możesz to zrobić w kodzie Java:

mRecyclerView.setNestedScrollingEnabled(false);

Ale masz również możliwość ustawienia tej samej właściwości w xml code ( 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" />

2

Jeśli używasz RecyclerView ScrollListener wewnątrz NestedScrollView , detektor addOnScrollListener nie działa poprawnie, jeśli używasz obu z nich.

Użyj tego kodu.

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

ten kod działa dobrze RecyclerView ScrollListener wewnątrz NestedScrollView .

dzięki


1

Musiałem zaimplementować CoordinatorLayout z przewijaniem paska narzędzi i zajęło mi to cały dzień. Pracuję, usuwając w ogóle NestedScrollView. Więc używam RelativeLayout w katalogu głównym.

<?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>

1

nie używaj recyclerView wewnątrz NestedScrollView. może powodować problemy kaskadowe! Sugeruję użycie ItemViewTypes w RecyclerView do obsługi wielu rodzajów widoków. wystarczy dodać RecyclerView o szerokości i wysokości match_parent. następnie w swoim recyclinglerViewAdapter zastąp parametr getItemViewType i użyj pozycji do obsługi układu, który ma zostać napompowany. potem możesz obsłużyć uchwyt widoku za pomocą metody onBindViewHolder.


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

0

Użyłem tego niesamowitego rozszerzenia (napisanego w Kotlin, ale może być również użyte w Javie)

https://github.com/Widgetlabs/expedition-nestedscrollview

Zasadniczo dostajesz NestedRecyclerViewwnętrze każdego pakietu, powiedzmy utils w swoim projekcie, a następnie po prostu utwórz swój widok recyklera

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

Sprawdź ten niesamowity artykuł autorstwa Marc Knaup

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


0

Rozwiązanie, aby nie ładować wszystkich elementów podrzędnych widoku recyklingu jednocześnie w zagnieżdżonym widoku przewijania.

Korzyści:

  1. nie ładuj wszystkich dzieci jeden raz, gdy używasz zagnieżdżonego widoku przewijania.
  2. możesz użyć recycleView.setHasFixedSize (true) dla lepszej wydajności
  3. uniemożliwiają serwisom internetowym wysyłanie wszystkich danych jednocześnie, paginacja działa zgodnie z oczekiwaniami
  4. dobre dla większej liczby zestawów danych.
  5. dobre dla urządzeń o niskiej pamięci
  6. może nadal korzystać z przewijania zagnieżdżonego
  7. bardzo pomocne, gdy Twój widok wyświetla kompleks przedmiotów i wymaga dużej ilości zasobów.

Naprawić :

w pliku xml zamiast używać match_parent lub wrap_content dla recycleview użyj fix fix .


-5

RecyclerView z 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" />
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.