NestedScrollView에서 RecyclerView를 사용하는 방법은 무엇입니까?


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 ScrollView (또는 NestedScrollView) 내에서 RecyclerView를 사용할 이유가 없습니다.
Gabriele Mariotti 2016 년

2
@Mecid는 스크롤 가능한 뷰를 다른 스크롤 가능한 뷰 안에 넣지 않아야합니다. Android의 일반적인 규칙입니다.
Gabriele Mariotti 2016 년

6
@GabrieleMariotti 나는이 규칙을 알고 있지만 NestedScrollView는이 문제를 해결하기 위해 개발되었습니다.
Mecid

1
올바르지 않습니다. NestedScrollView는 ScrollView와 유사하지만 중첩 스크롤 부모와 자식 역할을 모두 지원합니다. 귀하의 경우 자신의 스크롤 동작을 정의해야합니다.
Gabriele Mariotti 2016 년

답변:


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"

나머지 것들을 관리 할 것입니다.

하나 더, 네 RecycledView를 NestedScrollView 안에 넣을 필요가 없습니다.


33
이 솔루션이 왜 최대 투표율을 얻지 못하는지 이해할 수 없습니다. 그것은로 달성되지 않고로만 달성 NestedScrollView됩니다 app:layout_behavior="@string/appbar_scrolling_view_behavior". 이것이 열쇠입니다!
hata

3
@RahulUpadhyay 이것은 나를 위해 일했지만 마지막 줄이 잘못되었다고 생각합니다. RecyclerView가 NestedScrollView 안에 있으면 RecyclerView가 전혀 표시되지 않습니다. 그러나, 당신은 슈퍼 스타입니다 : D
Leon

3
효과가있다! 단지 업데이트 recyclerview 라이브러리 컴파일 'com.android.support:recyclerview-v7:+'
파비오 게라

28
이 용액에 사용하기위한 것이다 CoordinatorLayout, AppBarLayout그리고 적절한 설정 layout_scrollFlags으로 스크롤되는 아이 뷰 (들) RecyclerView. 왜 이것이 답에서 생략되었는지 확실하지 않습니다. 그렇지 않으면 이것은 훌륭하고 간단한 해결책입니다.
Sanvywell

9
RecyclerView의 재활용이 작동하지 않는다는 것을 이해하는 것이 매우 중요하다고 생각합니다. 결과적으로 항목 목록이 길면 UI가 눈에 띄게 나타납니다.
Gaket

121

업데이트 1

Android 지원 라이브러리 23.2.0부터 setAutoMeasureEnabled(true)LayoutManagers에 대한 메소드가 추가되었습니다 . 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.
Brais Gabin

1
@BraisGabin, 맞습니다 : setHasFixedSize (false)는 RecyclerView를 여러 번 새로 고치므로 항목이 많으면 매우 느리게 작동합니다. 이 경우
ListL

1
고마워요! 시간을 절약했습니다. 그건 그렇고, 마지막 항목 장식은이 레이아웃 관리자와 함께 표시되지 않으며 가능한 버그입니까?
Jjang

2
setAutoMeasureEnabled는 API 레벨 27.1.0부터 사용되지 않습니다. developer.android.com/reference/android/support/v7/widget/…
Dika

2
대신 boolean isAutoMeasureEnabled ()를 대체하십시오. 레이아웃의 측정 패스가 RecyclerView의 AutoMeasure 메커니즘을 사용해야하는지 또는 LayoutManager의 onMeasure (Recycler, State, int, int) 구현으로 수행되어야하는지 여부를 반환합니다. 이 메소드는 기본적으로 false를 리턴합니다 (실제로 더 이상 사용되지 않는 setAutoMeasureEnabled (boolean)에 전달 된 값을 리턴 함). LayoutManager가 RecyclerView에 의해 자동 측정되기를 원하면 true를 리턴하도록 대체되어야합니다. true를 반환하도록이 메서드를 재정의하는 경우 onMeasure (Recycler, State, int, int)를 재정의해서는 안됩니다.
Peterstev Uremgba

100

1) 지원 라이브러리 23.2.0 이상을 사용해야합니다.

2) RecyclerView높이가됩니다 wrap_content.

삼) 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)하면 매끄럽게 스크롤하는 데 도움이되었습니다.
Shubhral 2016 년

3
이것은 받아 들여야 할 답변입니다! 보기가 재활용되지 않고 모든보기가 한 번에 그려 질 것임을 지적하십시오.
M'hamed

3
@AshokVarma, 내가 직면하고있는 동일한 문제. 그러나 recyclerView 내에서 스크롤이 제대로 작동하지만 recyclerview에 대한 끝없는 스크롤을 구현할 수 없어서 recyclerview의 모든보기를 한 번에 믿기 때문에 웹 서비스 호출을 계속합니다. 어떻게 처리 할 수 ​​있습니까?
Anantha Babu

scrollview에서 recyclerview를 사용하는 대신 @AnanthaBabu. 스크롤보기의 모든 항목을 재활용 자보기의 항목으로 변환하십시오. recyclerviews 뷰 유형을 사용하고 다른 종류의 레이아웃을 페인트 할 수 있습니다. 이것들을 다루는 좋은 라이브러리가 있습니다 (뷰 구조가 정말로 복잡하고 재사용 가능한 구성 요소를 원한다면 라이브러리를 사용하십시오).
Ashok Varma 2012 년

1
@AshokVarma 재활용 행동 문제에 대한 해결책이 있습니까? 나는 recyclerview가 모든 어린이들을 한 번에 그리는 것을 원하지 않습니다.
andro-girl

36

android:fillViewport="true"NestedScrollView측정하는 데 사용할 수 있습니다 RecyclerView. 는 RecyclerView남아있는 높이를 채울 것입니다. 당신이 스크롤 싶다면 NestScrollView, 당신은 설정할 수 있습니다 RecyclerView'들 minHeight.


14
200 개의 아이템에 대한 리사이클 러 뷰가 있고이를 수행하면 중첩 된 스크롤 뷰가 확장되어 200 개의 전체 아이템을 채 웁니다!
RJFares

1
@RJFares 결코 일어나지 않았습니다. 데모를 시도하고 LayoutInspector를 사용하여 레이아웃을 검사하면 제대로 작동합니다. recyclerView 버전을 제공 할 수 있습니까?
zayn

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
그러나 이제는 더 이상 뷰를 재활용하지 않습니까?
Mark Buikema 2013

아뇨, 재활용되지 않습니까?
Vignesh Sundar 2017

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
두 번째 app : layout_behavior = "@ string / appbar_scrolling_view_behavior"를 제거 할 수 있습니다 . 동작은 CoordinatorLayout 직계 자녀 에게만 적용됩니다.
Pepster

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-그리고 그것은 또한 속성 isScrollContainermeasureAllChildren활성화 된 버터를 똑같이 스크롤합니다 :

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

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

NestedScrollView 내부에서 RecyclerView를 사용 했으며 저에게 효과적 이었습니다. 내가 명심해야 할 유일한 것은 NestedScrollView가 하나의 자식보기 만 취한다는 것입니다. 그래서 내 경우에는 RecyclerView를 포함하고있는 LienearLayout 뷰 그룹과 필요한 다른 여러 뷰를 사용했습니다.

내 RecyclerView를 NestedScrollView 안에 넣는 데 문제가 있습니다. RecyclerView의 내용을 스크롤하는 것이 느슨하다는 것을 깨달았습니다.

나중에 RecyclerView가 스크롤 이벤트를 수신하고 NestedScrollView의 스크롤 동작과 충돌한다는 것을 깨달았습니다.

따라서이 문제를 해결하려면이 방법으로 RecyclerView의 스크롤 기능을 비활성화해야했습니다 movieListNewRecyclerView.setNestedScrollingEnabled(false);

내가 실제로 한 일에 대한 짧은 비디오를 보려면 Instagram을 확인하십시오. 이것은 내 인스 타 그램 핸들 ofelix03입니다

내가 한 일을 보려면이 이미지를 클릭하십시오


5

NestedScrollView 안에 Viewpager와 RecyclerView가 있습니다. 아래 줄을 추가 한 후

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

느린 스크롤 및 스크롤 지연 문제를 해결했습니다.


3
당신은 의미하지 recyclerView.setHasFixedSize(true);않습니까?
키노 클레이튼

3

중첩 된 스크롤보기 내에서 리사이클 러보기를 사용할 수 없습니다. 스크롤 가능한 추가 뷰를 포함하지는 않지만 스크롤 레이아웃 자체의 자식이기 때문에 중첩 된 스크롤 뷰가 필요하기 때문입니다. 나는 같은 문제가 있었지만 결국 텍스트 뷰를 recyclerview 내에서 headerview로 이동하고 recyclerview를 코디네이터 레이아웃의 직접적인 자식으로 만들고 중첩 된 스크롤 뷰를 삭제했습니다. 그런 다음 내 모든 문제가 사라졌습니다.


8
때문에 RecyclerView구현 NestedScrollingChild, RecyclerView를 통해 스크롤 할 수 있어야한다 NestedScrollView.
Benjamin

나는 단지 영어 실수에 기초하여 stackoverflow.com/review/suggested-edits/9907622 를 거부하기로 투표 했지만 거기에 가치있는 내용이있을 수 있습니다. 그것을 청소할 수 있습니다. 거기에 유용한 것이 없다면,이 의견을 개조하여 삭제하도록 표시하십시오.
Mark Amery

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

그리고 당신의 자바 파일에서 :

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

recyclerview의 재활용 기능을 유지하고 recyclerview가 모든 데이터를로드하지 않도록하는 한 가지 솔루션은 recyclerview 자체에서 수정 높이를 설정하는 것입니다. 이렇게하면 recyclerview는 높이가 사용자에게 표시 할 수있는만큼만로드하도록 제한되므로 맨 아래 / 위로 스크롤하면 요소를 재활용 할 수 있습니다.


2

좋은 답변이 많이 있습니다. 키는 사용자가 설정해야한다는 것입니다 nestedScrollingEnabledfalse. 위에서 언급했듯이 자바 코드로 할 수 있습니다 :

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

NestedScrollView 내부에서 recyclerView를 사용하지 마십시오. 계단식 문제가 발생할 수 있습니다! 여러 종류의 뷰를 처리하기 위해 RecyclerView에서 ItemViewTypes를 사용하는 것이 좋습니다. match_parent 너비와 높이로 RecyclerView를 추가하십시오. 그런 다음 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모든 패키지 안에 프로젝트에서 utils라고 말한 다음과 같이 recyclerview를 만듭니다.

 <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

중첩 된 스크롤보기 안에 모든 재활용보기 자식을 한 번에로드하지 않는 솔루션 .

혜택 :

  1. 중첩 스크롤보기를 사용할 때 모든 자식을 한 번로드하지는 않습니다.
  2. recycleView.setHasFixedSize (true)를 사용하여 성능을 향상시킬 수 있습니다
  3. 웹 서비스가 모든 데이터를 한 번에 보내지 못하게합니다. 페이지 매김이 예상대로 작동합니다.
  4. 더 많은 수의 데이터 세트에 적합합니다.
  5. 메모리 부족 장치에 적합
  6. 중첩 된 스크롤을 계속 사용할 수 있습니다.
  7. recyle보기 항목이 복잡하고 많은 리소스가 필요할 때 매우 유용합니다.

수정 :

recycleview에 match_parent 또는 wrap_content 를 사용하는 대신 XML에서 fix height를 사용 하십시오 .


-5

NestedScrollView가있는 RecyclerView

    <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" />
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.