Как использовать RecyclerView внутри NestedScrollView?

210

Как использовать RecyclerViewвнутри NestedScrollView? RecyclerViewсодержимое не видно после настройки адаптера.

ОБНОВЛЕНИЕ Код макета обновлен.

<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
источник
github.com/chrisbanes/cheesesquare
Марчин Орловски,
@Mecid Нет причин использовать RecyclerView внутри ScrollView (или NestedScrollView).
Габриэле Мариотти
2
@Mecid, вы никогда не должны помещать прокручиваемое представление в другое прокручиваемое представление. Это общее правило в Android.
Габриэле Мариотти
6
@GabrieleMariotti Я знаю это правило, но NestedScrollView разработан для решения этой проблемы.
Месид
1
Это не правильно. NestedScrollView аналогичен ScrollView, но он поддерживает как вложенный прокручиваемый родитель, так и дочерний элемент. В вашем случае вы должны определить свое собственное поведение прокрутки.
Габриэле Мариотти

Ответы:

216

Замените свой recyclerView на,

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

будет управлять остальными вещами.

Еще одна вещь, нет необходимости помещать свой RecyclerView внутри NestedScrollView

Рахул Упадхьяй
источник
33
Я не могу понять, почему это решение не получает большинство голосов. Это не достигнуто с, NestedScrollViewно только с app:layout_behavior="@string/appbar_scrolling_view_behavior". Это ключ!
Хата
3
@RahulUpadhyay это сработало для меня, но я думаю, что ваша последняя строка неверна, RecyclerView вообще не отображается, если он находится внутри NestedScrollView. Тем не менее, вы суперзвезда: D
Леон
3
Оно работает! просто обновите библиотеку ресиверов, скомпилируйте 'com.android.support:recyclerview-v7:+'
Фабио Гуэрра
28
Это решение предназначено для использования с CoordinatorLayout, AppBarLayoutи установив соответствующий layout_scrollFlagsпо мнению ребенка (ы) , которые должны быть прокручиваются с RecyclerView. Не уверен, почему это было опущено в ответе. В противном случае это хорошее и простое решение.
Sanvywell
9
Я думаю, что очень важно понимать, что РЕЦИКЛИНГ RecyclerView НЕ РАБОТАЕТ здесь. В результате, если у вас длинный список элементов, он будет отображаться с заметным зависанием пользовательского интерфейса.
Гакет
121

ОБНОВЛЕНИЕ 1

Начиная с библиотеки поддержки Android 23.2.0 был добавлен метод setAutoMeasureEnabled(true) для LayoutManager. Это делает 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реализацию представления списка, создать для него аналог Adapter и сделать его вести себя как ListViewилиRecyclerView

кто-то знает
источник
19
Внимание! Не используйте это, если у вас есть много предметов в вашем RecyclerView.
Брайс Габин
1
@BraisGabin, вы правы: setHasFixedSize (false) вызывает многократное обновление RecyclerView, поэтому, если в нем много элементов, он будет работать очень медленно. В этих случаях я использую LinearLayout со своего рода «адаптером» для того, чтобы он вел себя как ListView или RecyclerView
smbd uknow
1
Большое спасибо! Спасли меня часы. Кстати, в этом менеджере раскладки (и только в этом) не отображается последний элемент оформления, возможная ошибка?
Jjang
2
Начиная с уровня API 27.1.0 setAutoMeasureEnabled устарела. developer.android.com/reference/android/support/v7/widget/…
Дика
2
Вместо этого переопределите логическое значение isAutoMeasureEnabled (). Возвращает, должен ли измерительный проход макета использовать механизм AutoMeasure RecyclerView или это должно быть выполнено реализацией onMeasure в LayoutManager (Recycler, State, int, int). Этот метод возвращает false по умолчанию (он на самом деле возвращает значение, переданное устаревшему setAutoMeasureEnabled (boolean)), и его следует переопределить, чтобы он возвращал значение 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
Это должен быть принятый ответ! потому что это хорошо указывает на то, что ни один вид не будет переработан и все виды будут нарисованы одновременно.
Мхамед
3
@AshokVarma, та же проблема, с которой я сталкиваюсь сейчас. но прокрутка работает нормально в recyclerView, но я не смог реализовать бесконечную прокрутку для recyclerview, потому что все виды drawerviewView рисуются одновременно, поэтому он продолжает вызывать веб-сервис. так как я могу справиться с этим?
Ананта Бабу
@AnanthaBabu вместо использования в обзоре прокрутки. преобразовать все элементы в представлении прокрутки в элементы в представлении переработчика. Вы можете использовать тип окна просмотра и рисовать различные типы макетов. Есть также несколько хороших библиотек для их обработки (используйте библиотеки, если у вас действительно сложная структура представления и если вы хотите использовать повторно используемые компоненты).
Ашок Варма
1
@AshokVarma есть ли решение проблемы поведения переработчика? Я не хочу, чтобы переработчик рисовал всех детей одним выстрелом.
Андро-девушка
36

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

Зайн
источник
15
если у вас есть просмотрщик из 200 предметов и вы делаете это, nestedscrollview будет расширяться, чтобы заполнить все 200 предметов!
RJFares
1
@ RJFares Этого никогда не было. Я пробую демонстрацию и использую LayoutInspector для проверки макета, он просто работает хорошо. Можете ли вы предоставить свои версииcyclerView?
Зайн
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
Но теперь это не перерабатывает взгляды больше?
Марк Буйкема
Нет, это будет перерабатывать, не так ли?
Виньеш Сундар
6
нет, это не так, я попробовал с очень сложной компоновкой с 200 элементами, nestedscrollview просто расширяется до размеров своих дочерних элементов, поэтому он будет расширяться, поэтому никакой переработки не произойдет. @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.
Pepster
2
Кроме того, важно отметить, что в качестве корневого макета у вас должна быть компоновка координатора . Это не всегда так.
Гакет
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. Следовательно, он не будет неоднозначным, как «прокручиваемый внутри прокручиваемый».

alcsan
источник
1
Это класс LinearLayoutManager из этой библиотеки: github.com/serso/android-linear-layout-manager/blob/master/lib/…
Кодирование ниндзя
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);

Я решил проблему медленной прокрутки и задержки прокрутки.

Isham
источник
3
Ты имеешь в виду recyclerView.setHasFixedSize(true);?
Кено Клейтон,
3

Вы не можете использовать представление рециркулятора во вложенном представлении прокрутки. Он не предназначен для того, чтобы содержать дополнительные прокручиваемые представления, но потому, что он является дочерним по отношению к самому макету с прокруткой, вам нужен вложенный прокручиваемый вид. У меня возникла та же проблема, но в итоге я переместил свое текстовое представление в представление заголовка в представлении реселлера, сделало его рекурсором прямым потомком макета координатора и удалило вложенное представление прокрутки. Тогда все мои проблемы исчезли.

Барри Ирвин
источник
8
Поскольку RecyclerViewинструменты NestedScrollingChild, RecyclerViewдолжны быть в состоянии прокручиваться с помощью NestedScrollView.
Бенджамин
Я только что проголосовал за отклонение stackoverflow.com/review/suggested-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); сделаем свое дело.

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

uniruddh
источник
Будьте осторожны, используя «mRecyclerView.setHasFixedSize (true);» хотя. Вы можете использовать его, только если вы не добавляете и не удаляете элементы из представления переработчика во время выполнения.
Гакет
2

Одним из решений, позволяющих сохранить функцию рециркуляции в обзоре утилизатора и избежать его повторной загрузки для загрузки всех ваших данных, является установка фиксированной высоты в самом обзоре утилизатора. Делая это, просмотр переработчика ограничивается только загрузкой настолько, насколько его высота может показать пользователю, таким образом, перерабатывая его элемент, если вы когда-нибудь прокрутите его вниз / вверх.

Кристиан Каллереро
источник
2

Есть много хороших ответов. Ключ в том, что вы должны установить nestedScrollingEnabledна false. Как уже упоминалось выше, вы можете сделать это в коде Java:

mRecyclerView.setNestedScrollingEnabled(false);

Но также у вас есть возможность установить то же свойство в 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

Если вы используете 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

не используйте recyclerView внутри NestedScrollView. это может вызвать каскадные проблемы! Я предлагаю использовать ItemViewTypes в RecyclerView для обработки нескольких видов представлений. просто добавьте RecyclerView с шириной и высотой match_parent. затем в вашем recyclerViewAdapter переопределите 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" />

Проверьте эту удивительную статью от Marc Knaup

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

Гастон Сайлен
источник
0

Решение не загружать сразу все дочерние элементы recyclew view внутри вложенного представления прокрутки.

Benfits:

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

Исправить:

в вашем xml вместо использования match_parent или wrap_content для повторного просмотра используйте фиксированную высоту .

Абхишек Гарг
источник
0

Для моего случая дочерним элементом NestedScrollview является ConstraintLayout. Это не работает, как ожидалось, я заменил его на LinearLayout. Может быть, это кому-то помогает.

<androidx.core.widget.NestedScrollView 
  android:id="@+id/nestedScrollView" 
  android:layout_width="match_parent" 
  android:layout_height="match_parent">

  <LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:descendantFocusability="blocksDescendants">

    <androidx.recyclerview.widget.RecyclerView
      android:id="@+id/recyclerView"
      android:layout_width="0dp"
      android:layout_height="wrap_content"
      android:nestedScrollingEnabled="false"
      app:layout_constraintBottom_toTopOf="@+id/divider"
      app:layout_constraintEnd_toEndOf="parent"
      app:layout_constraintStart_toStartOf="parent"
      app:layout_constraintTop_toBottomOf="@+id/tinTitle"/>

  </LinearLayout>
</androidx.core.widget.NestedScrollView>
nAkhmedov
источник
-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" />
деванги чхатбар
источник