ScrollView 내부의 Recyclerview가 부드럽게 스크롤되지 않습니다


179

내 애플 리케이션을 위해 내가 사용하고 RecyclerView내부 a를 ScrollView(가) RecyclerView사용하여 내용에 따라 높이가 이 라이브러리를 . 스크롤이 작동하지만을 스크롤하면 부드럽게 작동하지 않습니다 RecyclerView. 나는 오버 스크롤하면 ScrollView원활 스크롤됩니다 자체.

내가 정의하는 데 사용하는 코드 RecyclerView:

LinearLayoutManager friendsLayoutManager = new LinearLayoutManager(getActivity().getApplicationContext(), android.support.v7.widget.LinearLayoutManager.VERTICAL, false);
mFriendsListView.setLayoutManager(friendsLayoutManager);
mFriendsListView.addItemDecoration(new DividerItemDecoration(getActivity().getApplicationContext(), null));

RecyclerView에서 ScrollView:

<android.support.v7.widget.RecyclerView
    android:layout_marginTop="10dp"
    android:layout_marginBottom="10dp"
    android:id="@+id/friendsList"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />

이 솔루션은 저에게 효과적입니다. stackoverflow.com/a/32390370/7308789 감사합니다
Houssin Boulla 2016 년

1
@tahaDev 귀하의 경우에 정확히 작동하지 않는 것은 더 자세히 설명하십시오. 또한 귀하의 경우에는 제공된 솔루션이없는 것처럼 보입니다. 그렇습니까?
Pravin Divraniya

androidx.constraintlayout.widget.ConstraintLayout복잡한 구현없이 문제를 해결할 수있는 사용
Saswata

답변:


379

시도해보십시오 :

RecyclerView v = (RecyclerView) findViewById(...);
v.setNestedScrollingEnabled(false);

대안으로, 지원 디자인 라이브러리를 사용하여 레이아웃을 수정할 수 있습니다. 현재 레이아웃이 다음과 같은 것 같습니다.

<ScrollView >
   <LinearLayout >

       <View > <!-- upper content -->
       <RecyclerView > <!-- with custom layoutmanager -->

   </LinearLayout >
</ScrollView >

이를 다음과 같이 수정할 수 있습니다.

<CoordinatorLayout >

    <AppBarLayout >
        <CollapsingToolbarLayout >
             <!-- with your content, and layout_scrollFlags="scroll" -->
        </CollapsingToolbarLayout >
    </AppBarLayout >

    <RecyclerView > <!-- with standard layoutManager -->

</CoordinatorLayout >

그러나 이것은 더 오래 걸리는 길이며, 사용자 정의 선형 레이아웃 관리자에 문제가 없다면 리사이클 러보기에서 중첩 스크롤을 비활성화하십시오.

편집 (2016 년 4 월 3 일)

v 23.2지원 라이브러리 의 릴리스는 이제 모든 기본 설정에서 팩토리 "컨테이너 랩핑"기능을 포함합니다 LayoutManager. 나는 그것을 테스트하지는 않았지만 아마도 사용중인 라이브러리보다 선호해야 할 것입니다.

<ScrollView >
   <LinearLayout >

       <View > <!-- upper content -->
       <RecyclerView > <!-- with wrap_content -->

   </LinearLayout >
</ScrollView >

16
이 답변에 추가하려면 : setNestedScrollingEnabled(false)난을 전환하는 경우에만 작동 ScrollViewA의 NestedScrollView대신.
Richard Le Mesurier

11
나를 위해, setNestedScrollingEnabled(false)RecyclerView안에있는 부드러운 스크롤을 다시주었습니다. ScrollView감사합니다! 그러나 나는 왜 그것이 작동하는지 이해하지 못합니다 ...? 중첩 스크롤을 거짓으로 설정한다는 것은 실제로 무엇을 의미합니까?
Micro

33
참고 android:nestedScrollingEnabled="false"전용 API 작동 21+하지만 v.setNestedScrollingEnabled(false)<21 OK입니다.
Eric B.

3
나중에 참조 할 수 있도록 marshmallow / nougat (API 23, 24) 장치 에서만 발생 하는 RecyclerViewwrap_content 문제가 발생하는 경우 stackoverflow.com/a/38995399/132121 에서 해결 방법을 확인하십시오ScrollView
Hossain Khan

2
내가 지금 겪고있는이 솔루션의 단점은 RecyclerView가 onScrollListener의 이벤트를 수신하지 않는다는 것입니다. 재활용품에 일정량의 품목 만있을 때 더 많은 데이터를 가져 오기 위해 필요한 것
Daniel W.

82

나는 이것을 사용해야했다.

mMyRecyclerView.setNestedScrollingEnabled(false);

onCreateView()방법으로.

고마워요!


26

이 방법으로 사용할 수 있습니다 :

이 라인을 recyclerView xml 파일에 추가하십시오.

android:nestedScrollingEnabled="false"

또는 자바 코드에서 :

RecyclerView.setNestedScrollingEnabled(false);

이것이 도움이 되었기를 바랍니다.


10
Api 21+ 필요
Muhammad Riyaz

11

XML과 프로그래밍 방식을 모두 사용해 볼 수 있습니다. 그러나 당신이 직면 할 수있는 문제는 (API 21 이하) XML로 수행하면 작동하지 않습니다. 따라서 Activity / Fragment에서 프로그래밍 방식으로 설정하는 것이 좋습니다.

XML 코드 :

<android.support.v7.widget.RecyclerView
      android:id="@+id/recycleView"
      android:layout_width="match_parent"
      android:visibility="gone"
      android:nestedScrollingEnabled="false"
      android:layout_height="wrap_content"
      android:layout_below="@+id/linearLayoutBottomText" /> 

프로그래밍 방식으로 :

 recycleView = (RecyclerView) findViewById(R.id.recycleView);
 recycleView.setNestedScrollingEnabled(false);

6

스크롤보기 대신 중첩 스크롤보기를 사용하면 문제가 해결되었습니다.

<LinearLayout> <!--Main Layout -->
   <android.support.v4.widget.NestedScrollView>
     <LinearLayout > <!--Nested Scoll View enclosing Layout -->`

       <View > <!-- upper content --> 
       <RecyclerView >


     </LinearLayout > 
   </android.support.v4.widget.NestedScrollView>
</LinearLayout>

5

비슷한 문제가 있습니다 (Google PlayStore 디자인과 같은 중첩 RecyclerViews를 만들려고했습니다). 이를 처리하는 가장 좋은 방법은 하위 RecyclerView를 서브 클래 싱하고 'onInterceptTouchEvent'및 'onTouchEvent'메소드를 대체하는 것입니다. 이렇게하면 해당 이벤트의 동작 및 스크롤 방식을 완전히 제어 할 수 있습니다.


3

ScrollView를 NestedScrollView로 바꾸면 맨 아래로 부드럽게 스크롤됩니다.


1

childview에서 VideoView 또는 중량 위젯을 사용하는 경우 RecyclerView를 높이 wrap_content 가 NestedScrollView 안에 높이로 유지 match_parent 하면 스크롤이 원하는대로 완벽하게 작동합니다.

참고로,

<android.support.v4.widget.NestedScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <android.support.v7.widget.RecyclerView
            android:layout_width="match_parent"
            android:nestedScrollingEnabled="false"
            android:layout_height="wrap_content"
            android:clipToPadding="false" />

</android.support.v4.widget.NestedScrollView>

고마워 마이크로 이것은 당신의 힌트에서 온 것입니다!

카르 틱


1

모든 답변 요약 (장점 및 단점)

단일 리사이클 러보기

코디네이터 레이아웃 내에서 사용할 수 있습니다.

장점 -전체 recyclerview 항목을로드하지 않습니다. 부드러운 로딩.

단점 -코디네이터 레이아웃 내에 두 개의 recyclerview를로드 할 수 없습니다-스크롤 문제가 발생합니다

참조-https: //stackoverflow.com/a/33143512/3879847

최소 행이 여러 개인 recylerview

NestedScrollView 내부에로드 할 수 있습니다

장점 -부드럽게 스크롤됩니다

단점 -모든 행의 recyclerview를로드하여 활동이 지연되어 열립니다.

참조-https: //stackoverflow.com/a/33143512/3879847

큰 행이있는 다중 recylerview (100 개 이상)

recyclerview와 함께 가야합니다.

장점 -부드럽게 스크롤하고 부드럽게로드

단점 -더 많은 코드와 논리를 작성해야합니다.

멀티 뷰 홀더의 도움을 받아 각 recylerview를 메인 Recyclerview 내부에로드

전의:

MainRecyclerview

-ChildRecyclerview1 (ViewHolder1)

-ChildRecyclerview2 (ViewHolder2)

-ChildRecyclerview3 (ViewHolder3) 

-Any other layout   (ViewHolder4)

멀티 viewHolder에 대한 참조 - https://stackoverflow.com/a/26245463/3879847


0

XML 코드 :

<android.support.v4.widget.NestedScrollView
            android:layout_width="match_parent"
            android:layout_height="match_parent">

            <android.support.v7.widget.RecyclerView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:clipToPadding="false" />

        </android.support.v4.widget.NestedScrollView>

자바 코드에서 :

  recycleView = (RecyclerView) findViewById(R.id.recycleView);
     recycleView.setNestedScrollingEnabled(false);

0

또는 당신은 단지 android:focusableInTouchMode="true"재활용보기에서 설정할 수 있습니다


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

    <android.support.v4.widget.NestedScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent">

        <android.support.constraint.ConstraintLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent">

            <android.support.constraint.ConstraintLayout
                android:id="@+id/constraintlayout_main"
                android:layout_width="match_parent"
                android:layout_height="@dimen/layout_width_height_fortyfive"
                android:layout_marginLeft="@dimen/padding_margin_sixteen"
                android:layout_marginRight="@dimen/padding_margin_sixteen"
                app:layout_constraintLeft_toLeftOf="parent"
                app:layout_constraintRight_toRightOf="parent">

                <TextView
                    android:id="@+id/textview_settings"
                    style="@style/textviewHeaderMain"
                    android:gravity="start"
                    android:text="@string/app_name"
                    app:layout_constraintLeft_toLeftOf="parent"
                    app:layout_constraintRight_toRightOf="parent" />

            </android.support.constraint.ConstraintLayout>

            <android.support.constraint.ConstraintLayout
                android:id="@+id/constraintlayout_recyclerview"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginStart="@dimen/padding_margin_zero"
                android:layout_marginTop="@dimen/padding_margin_zero"
                android:layout_marginEnd="@dimen/padding_margin_zero"
                app:layout_constraintLeft_toLeftOf="parent"
                app:layout_constraintRight_toRightOf="parent"
                app:layout_constraintTop_toBottomOf="@+id/constraintlayout_main">

                <android.support.v7.widget.RecyclerView
                    android:id="@+id/recyclerview_list"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:nestedScrollingEnabled="false"
                    app:layout_constraintLeft_toLeftOf="parent"
                    app:layout_constraintRight_toRightOf="parent" />

            </android.support.constraint.ConstraintLayout>

        </android.support.constraint.ConstraintLayout>

    </android.support.v4.widget.NestedScrollView>

</android.support.constraint.ConstraintLayout>

이 코드는 ConstraintLayout 안드로이드에서 작동합니다


0

코 틀린

스크롤보기 아래에있는 모든 RecyclerView isNestedScrollingEnabledfalse대해 설정

val recyclerView = findViewById<RecyclerView>(R.id.recyclerView)
recyclerView.isNestedScrollingEnabled = false

XML 레이아웃 사용

<android.support.v7.widget.RecyclerView
    android:layout_marginTop="10dp"
    android:layout_marginBottom="10dp"
    android:id="@+id/friendsList"
    android:layout_width="match_parent"
    android:nestedScrollingEnabled="false"
    android:layout_height="wrap_content" />
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.