Як використовувати RecyclerView всередині NestedScrollView?


210

Як використовувати RecyclerViewвсередину NestedScrollView? RecyclerViewвміст не видно після встановлення адаптера.

Код верстки 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 Немає причин використовувати RecyclerView всередині ScrollView (або NestedScrollView).
Габріеле Маріоти

2
@Mecid ви ніколи не повинні ставити прокручуваний вид у інший вигляд, який можна прокручувати. Це загальне правило в Android.
Габріеле Маріоти

6
@GabrieleMariotti Я знаю це правило, але NestedScrollView розробив для вирішення цієї проблеми.
Mecid

1
Це не правильно. NestedScrollView подібно до ScrollView, але він підтримує роль як вкладеного прокрутки батьків, так і дитини. У вашому випадку ви повинні визначити власну поведінку прокрутки.
Габріеле Маріоти

Відповіді:


216

Замініть ваш вторинний переглядач на,

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

тут,

app:layout_behavior="@string/appbar_scrolling_view_behavior"

керуватиме рештою.

І ще одне - не потрібно ставити ваш вторинний переглядач всередині NestedScrollView


33
Я не можу зрозуміти, чому це рішення не отримує найбільше голосів. Це не досягнуто з, NestedScrollViewа просто з app:layout_behavior="@string/appbar_scrolling_view_behavior". Це ключ!
хата

3
@RahulUpadhyay це працювало для мене, але я думаю, що ваш останній рядок неправильний, RecyclerView взагалі не відображається, якщо він знаходиться всередині NestedScrollView. Однак ти суперзірка: D
Леон

3
Це працює! просто оновіть компіляцію бібліотеки reciklierview 'com.android.support:recyclerview-v7:+'
Фабіо Гуерра

28
Це рішення призначене для використання з CoordinatorLayout, AppBarLayoutта встановлення відповідних layout_scrollFlagsдочірніх переглядів, які слід прокручувати за допомогою RecyclerView. Не впевнений, чому це було пропущено з відповіді. Інакше це приємне і просте рішення.
Санвівелл

9
Я думаю, що дуже важливо розуміти, що РЕЦИКЛІНГ RecyclerView НЕ РОБОТИ тут. Як результат, якщо у вас довгий список елементів, він з’явиться з помітним заморожуванням інтерфейсу користувача.
Гакет

121

ОНОВЛЕННЯ 1

Оскільки бібліотека підтримки Android 23.2.0, для LayoutManagers був доданий метод setAutoMeasureEnabled(true). Це робить RecyclerView загортати його вміст і працює як шарм.
http://android-developers.blogspot.ru/2016/02/android-support-library-232.html

Тому просто додайте щось подібне:

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


ОНОВЛЕННЯ 2

Оскільки 27.1.0 setAutoMeasureEnabledзастаріло, то вам слід забезпечити власну реалізацію LayoutManager за допомогою методу, що перекриваєтьсяisAutoMeasureEnabled()

Але після багатьох випадків використання RecyclerView я настійно рекомендую не використовувати його в режимі обгортання , оскільки це не те, для чого призначений. Спробуйте переробляти весь ваш макет, використовуючи звичайний єдиний RecyclerView з кількома типами елементів. Або скористайтеся підходом з LinearLayout, який я описав нижче як крайній захід


Стара відповідь (не рекомендується)

Можна використовувати RecyclerViewвсередину NestedScrollView. Перш за все, ви повинні реалізувати свій власний звичай LinearLayoutManager, це змушує вас RecyclerViewобгортати його вміст. Наприклад:

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

Після цього використовуйте це LayoutManagerдля свогоRecyclerView

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

Але вам також слід назвати ці два методи:

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

Тут setNestedScrollingEnabled(false)вимкніть прокрутку для RecyclerView, так що вона не перехоплює подію прокрутки з NestedScrollView. І setHasFixedSize(false)визначте, що зміни вмісту адаптера можуть змінювати розмірRecyclerView

Важлива примітка: Це рішення має невелику помилку в деяких випадках і має проблеми з виконанням, тому, якщо у вас є багато елементів, RecyclerViewя рекомендую скористатись LinearLayoutвласною реалізацією списку списку, створіть для нього аналог адаптера та зробіть його поводитись як ListViewабоRecyclerView


19
Обережно! Не використовуйте це, якщо у вас багато предметів RecyclerView.
Браїс Габін

1
@BraisGabin, ви маєте рацію: setHasFixedSize (false) викликає багаторазове оновлення RecyclerView, тому якщо у нього багато предметів, він буде працювати дуже повільно. У цих випадках я використовую LinearLayout з певним спеціальним "адаптером" для нього, щоб він поводився як ListView або RecyclerView
smbd uknow

1
Дуже дякую! Економили мені години. До речі, остання прикраса елемента не відображається з цим менеджером компонування (і лише з цим), можлива помилка?
Jjang

2
setAutoMeasureEnabled застаріло на рівні API 27.1.0 developer.android.com/reference/android/support/v7/widget/…
Діка

2
замість boolean буде заміненоAutoMeasureEnabled (). він повертає, чи повинен вимірювальний пропуск макета використовувати механізм AutoMeasure RecyclerView або це має бути зроблено реалізацією LayoutManager onMeasure (Recycler, State, int, int). Цей метод повертає false за замовчуванням (він фактично повертає значення, передане застарілому setAutoMeasureEnabled (булевий)), і його слід перекрити, щоб повернути true, якщо LayoutManager хоче автоматично виміряти RecyclerView. Якщо цей метод буде відмінено, щоб повернути true, onMeasure (Recycler, State, int, int) не повинен бути відмінений.
Петерстев Уремгба

100

1) Вам потрібно використовувати бібліотеку підтримки 23.2.0 (або) вище

2) і RecyclerViewвисота буде wrap_content.

3) recyclerView.setNestedScrollingEnabled(false)

Але виконуючи це, схема рециркулятора не працює . (Тобто всі види будуть завантажені відразу , тому що wrap_contentпотреби в висоті повна RecyclerViewтому він буде малювати все дитини 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`. Вплив на продуктивність буде дуже високою.

Щоб зробити його простішим, "він просто діє, як LinearLayoutі всі дитячі погляди"


6
Дякую @Ashok Налаштування recyclerView.setNestedScrollingEnabled(false)допомогло мені плавно прокручувати.
Шубхрал

3
Це має бути прийнята відповідь! тому добре вкажіть, що жодне подання не буде перероблено, і весь погляд буде одразу намальовано.
M'hamed

3
@AshokVarma, те саме питання, з яким я стикаюся зараз. але прокрутка працює нормально всередині recilerView, але я не міг реалізувати Нескінченний прокручування для recilerview, тому що всі погляди рециркуляції малює відразу, тому це призводить до продовження виклику веб-служби. так як я можу це впоратися?
Ананта Бабу

@AnanthaBabu замість того, щоб використовувати рециркулятор в режимі прокрутки. перетворити всі елементи прокрутки в елементи перегляду рециркулятора. Ви можете використовувати тип перегляду reciklier і малювати різні види макетів. Є кілька хороших бібліотек, які також можуть працювати з ними (Використовуйте бібліотеки, якщо у вас справді складна структура перегляду і якщо ви хочете багаторазові компоненти).
Ашок Варма

1
@AshokVarma чи є рішення щодо проблеми поведінки утилізатора? Я не хочу, щоб утилізатор малював усіх дітей на одному знімку.
андро-дівчина

36

Ви можете використовувати android:fillViewport="true"для NestedScrollViewвимірювання RecyclerView. RecyclerViewЗаповнить залишилася висоту. тож якщо ви хочете прокручувати NestScrollView, ви можете встановити RecyclerViews minHeight.


14
якщо у вас є перегляд рециркуляторів на 200 елементів, і ви це зробите, вкладений перегляд розшириться, щоб заповнити всі 200 елементів!
RJFares

1
@RJFares Це ніколи не бувало. Я пробую демонстрацію і використовую LayoutInspector для перевірки макета, він просто працює добре. Чи можете ви надати свої версії recilerView?
заїн

26

Просто додавання recyclerView.setNestedScrollingEnabled(false);до цього setAdapterпрацювало на мене. Я ніде не додав app:layout_behavior="@string/appbar_scrolling_view_behavior"і не встановив будь-якого спеціального менеджера макетів

<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
Але тепер він більше не переробляє погляди?
Марк Буйкема

Ні, він переробить, чи не так?
Vignesh Sundar

6
ні, це не так, я спробував із дуже складною компоновкою з 200 предметів, просто вкладений розширюється до розміру своїх дітей, тому він розшириться, тому переробка не відбудеться @MarkBuikema Ви не встигли знайти краще рішення?
RJFares

20

Це те, що працює для мене

<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
Ви можете видалити другий додаток: layout_behavior = "@ string / appbar_scrolling_view_behavior" Оскільки поведінка працює лише для прямих дітей CoordinatorLayout.
Пепстер

2
Крім того, важливо згадати, що ви повинні мати макет координатора як ваш макет кореня. Це не завжди так.
Gaket

10

Існує простий і код тестування, який ви можете перевірити

<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

Бо androidxвін називається androidx.core.widget.NestedScrollView- і він також прокручує схоже масло з властивостями isScrollContainerта measureAllChildrenвключеним:

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

Спробуйте використовувати цю бібліотеку - https://github.com/serso/android-linear-layout-manager .

LayoutManager бібліотеки робить RecyclerView обгортанням свого вмісту. У цьому випадку RecyclerView буде "настільки ж великим, як внутрішній вигляд", тому у нього не буде панелей прокрутки, і користувач буде використовувати можливості прокрутки NestedScrollView. Тому це не буде неоднозначним, як "прокручується всередині прокручуваного".


1
Це клас LinearLayoutManager з цієї бібліотеки: github.com/serso/android-linear-layout-manager/blob/master/lib/…
Кодування Ninja

6

Ось код, який я використовую, щоб уникнути проблем прокрутки:

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

6

Я використовував RecyclerView всередині NestedScrollView, і він працював на мене. Єдине, про що я мав пам’ятати, - це те, що NestedScrollView має лише одне дитяче перегляд. Тож у моєму випадку я використовував групу перегляду LienearLayout, в якій розміщувався мій RecyclerView, а також ряд інших переглядів, які мені потрібні.

У мене виникає проблема, коли мій RecyclerView розміщується всередині NestedScrollView. Я зрозумів, що прокрутка вмісту мого RecyclerView відкладена.

Пізніше я зрозумів, що мій RecyclerView отримує подію прокрутки і тому суперечив поведінці прокрутки NestedScrollView.

Отже, щоб вирішити цю проблему, мені довелося вимкнути функцію прокрутки мого RecyclerView цим методом movieListNewRecyclerView.setNestedScrollingEnabled(false);

Ви можете перевірити мій Instagram на коротке відео про те, що я насправді робив. Це моя ручка instagram ofelix03

Клацніть це зображення, щоб побачити, що я зробив


5

У мене є Viewpager і RecyclerView всередині NestedScrollView. Після додавання рядків нижче

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

Я вирішив проблему повільного прокручування та прокрутки.


3
Ви не маєте на увазі recyclerView.setHasFixedSize(true);?
Кено Клейтон

3

Ви не можете використовувати подання рециркулятора у вкладеному вікні прокрутки. Він не призначений для подальших подань, які можна прокручувати, але це тому, що саме дочірній макет прокрутки вам потрібен вкладений вид прокрутки. У мене була така ж проблема, але врешті-решт я перемістив моє перегляд тексту як перегляд заголовка в перегляді рециркулятора, зробив рециркулятор прямим дочірньою схемою координатора та видалив вкладений вигляд прокрутки. Тоді всі мої проблеми пішли.


8
Так як RecyclerViewзнаряддя NestedScrollingChild, RecyclerViewповинні мати можливість прокручувати з допомогою NestedScrollView.
Бенджамін

Я просто проголосував за відхилення stackoverflow.com/review/sugges-edits/9907622, засноване виключно на англійських помилках, але там може бути зміст цінності - кожен, хто проходить мимо зі знанням предмета, повинен подивитися і подивитися, чи вони може почистити. Якщо там немає нічого корисного, позначте мої коментарі для видалення модами.
Марк Амері

3

Якщо ви використовуєте RecyclerView-23.2.1або пізніше. Наступне рішення буде добре працювати:

У свій макет додайте RecyclerView так:

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

І у вашому файлі 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()));

Тут layoutManager.setAutoMeasureEnabled(true);зробимо трюк.

Перегляньте цю проблему та цей блог розробників для отримання додаткової інформації.


Будьте обережні, використовуючи "mRecyclerView.setHasFixedSize (true);" хоч. Ви можете використовувати його лише в тому випадку, якщо під час виконання не додавати або видаляти елементи з перегляду утилізатора.
Gaket

2

Одним із варіантів збереження функції переробки reciklierview та уникнення перегляду reciklier для завантаження всіх ваших даних є встановлення висоти фіксації у самому recilerviewview. При цьому перегляд рециркулятора обмежується лише завантаженням стільки, скільки його висота може показувати користувачеві, таким чином переробляючи його елемент, якщо коли-небудь ви прокручуєте донизу / вгорі.


2

Є багато хороших відповідей. Ключ в тому , що ви повинні встановити nestedScrollingEnabledв false. Як було сказано вище, ви можете зробити це в коді Java:

mRecyclerView.setNestedScrollingEnabled(false);

Але також у вас є можливість встановити ту саму властивість у 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" />

2

Якщо ви використовуєте RecyclerView ScrollListener всередині NestedScrollView , слухач addOnScrollListener не працює належним чином, якщо ви використовуєте обидва.

Використовуйте цей код.

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

цей код добре працює RecyclerView ScrollListener всередині NestedScrollView .

Дякую


1

Мені довелося реалізувати CoordinatorLayout за допомогою прокрутки на панелі інструментів, і це просто зайняло мене цілий день безладу. У мене це працює, видаляючи NestedScrollView взагалі. Тому я просто використовую RelativeLayout в корені.

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

не використовуйте recilerView всередині NestedScrollView. це може спричинити каскадні проблеми! Я пропоную використовувати ItemViewTypes в RecyclerView для обробки декількох видів переглядів. просто додайте RecyclerView з шириною та висотою match_parent. то у вашому recilerViewAdapter переосмисліть getItemViewType та використовуйте позицію для обробки того, який макет потрібно надути. після цього ви можете обробити власника перегляду за допомогою методу 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

Я використав це дивовижне розширення (написане в kotlin, але його також можна використовувати на Java)

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

В основному ви отримуєте NestedRecyclerViewвсередині будь-якого пакета, який дозволяє говорити про утиліти у вашому проекті, а потім просто створюйте рециркулятор, як, наприклад

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

Перевірте цю дивовижну статтю Марка Кнаупа

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


0

Рішення не завантажувати одразу все доручне зображення перегляду, яке знаходиться у вкладеному вікні прокрутки.

Бенфіти:

  1. не завантажувати всю дитину один раз, коли використовується вкладений вигляд прокрутки.
  2. ви можете використовувати recycleView.setHasFixedSize (true) для кращої продуктивності
  3. не дозволяти веб-сервісам надсилати всі дані одразу, сторінка працює як слід
  4. добре для більшої кількості наборів даних.
  5. добре для пристроїв із низькою пам’яттю
  6. можна продовжити використовувати вкладені прокрутки
  7. дуже корисно, коли ваш елемент перегляду переробки складний і вимагає багато ресурсів.

Виправити:

у вашому xml замість того, щоб використовувати match_parent або wrap_content для recycleview, використовуйте fix fix .


-5

RecyclerView з 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" />
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.