6

I have some problem with scrolling in RecyclerView within a NestedScrollView, beside CollapsingToolbarLayout.
The Problem is RecyclerView Does not Scroll and CollapsingToolbarLayout Does not Expand/Collapse. Here is the XML:

 <android.support.v4.widget.DrawerLayout 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:id="@+id/drawerLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layoutDirection="rtl"
tools:context=".MainActivity">

<android.support.design.widget.CoordinatorLayout
    android:id="@+id/rootLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="256dp"
        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

        <android.support.design.widget.CollapsingToolbarLayout
            android:id="@+id/collapsingToolbarLayout"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:elevation="12dp"
            app:contentScrim="?attr/colorPrimary"
            app:expandedTitleMarginEnd="64dp"
            app:expandedTitleTextAppearance="@color/trans"
            app:layout_scrollFlags="scroll|enterAlwaysCollapsed">

            <ImageView
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:scaleType="centerCrop"
                android:src="@drawable/header" />

            <ImageView
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:scaleType="centerCrop"
                android:src="@drawable/header_basij" />

            <android.support.v7.widget.Toolbar
                android:id="@+id/toolbar"
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                android:minHeight="?attr/actionBarSize"
                android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
                app:layout_collapseMode="pin"
                app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />

        </android.support.design.widget.CollapsingToolbarLayout>

    </android.support.design.widget.AppBarLayout>

    <android.support.v4.widget.NestedScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fadeScrollbars="true"
        android:fillViewport="true"
        android:scrollbarDefaultDelayBeforeFade="1000"
        android:scrollbarFadeDuration="2000"
        android:scrollbars="vertical"
        app:layout_behavior="@string/appbar_scrolling_view_behavior">

        <LinearLayout
            android:id="@+id/containerLayout"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical">

            <pl.droidsonroids.gif.GifImageView
                android:id="@+id/pbar"
                android:layout_width="100dp"
                android:layout_height="30dp"
                android:layout_gravity="center"
                android:layout_marginTop="8dp"
                android:background="@color/trans"
                android:src="@drawable/loader"
                />

            <LinearLayout
                android:id="@+id/interneterror"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="20dp"
                android:orientation="vertical"
                android:visibility="visible">

                <TextView
                    android:id="@+id/errorhandler"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:gravity="center"
                    android:text="خطا در اتصال به اینترنت"
                    android:textColor="#212121" />

                <Button
                    android:id="@+id/tryagainme"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_gravity="center"
                    android:text="سعی دوباره"
                    android:textColor="@color/colorPrimary" />

            </LinearLayout>

            <android.support.v7.widget.RecyclerView
                xmlns:android="http://schemas.android.com/apk/res/android"
                xmlns:tools="http://schemas.android.com/tools"
                android:id="@+id/recyclerView"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:fadeScrollbars="true"
                android:layoutDirection="rtl"
                android:scrollbars="vertical"
                tools:context=".MainActivity"/>

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

</android.support.design.widget.CoordinatorLayout>

<android.support.design.widget.NavigationView
    android:id="@+id/navigation"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    android:layoutDirection="rtl"
    app:headerLayout="@layout/navigation_header"
    app:itemIconTint="@color/nav_item_icon_tint_color"
    app:itemTextColor="@color/nav_item_text_color"
    app:menu="@menu/navigation_menu" />

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

Thanks For Help.

  • Possible duplicate of [How to use RecyclerView inside NestedScrollView?](http://stackoverflow.com/questions/31000081/how-to-use-recyclerview-inside-nestedscrollview) – smbd uknow Nov 05 '15 at 13:58

2 Answers2

3

You need to call "recyclerView.setNestedScrollingEnabled(false)"

Abhinav Singh Maurya
  • 3,313
  • 8
  • 33
  • 51
Ram Prakash Bhat
  • 1,308
  • 12
  • 21
0

The reason is because NestedScrollView does not call AppBarLayout.Behavour class when it receive scroll events from recyclerview. that is, when a scroll happens in recyclerview, recyclerview dispatches/passes the scroll progress to NestedScrollView. NestedScrollView receives the scroll event but does nothing with it.

Inside nestedscrollview class

@Override
public void onNestedpreScroll(View target,int dx, int dy, int[] consumed){
         //Do nothing
}

To overcome this and make appbarlayout expand/collapse when scrolling recyclerview, just create a custom class that extends NestedScrollView and overide the above method and call method dispatchNestedPreScroll() which informs the appbarlayout of the scroll event and make it respond to it.

  public class CustomNestedScrollView extends NestedScrollView{

    public CustomNestedScrollView(Context context) {
    super(context);
    }

    public CustomNestedScrollView(Context context, AttributeSet attrs) {
    super(context, attrs);
    }

    public CustomNestedScrollView(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    }

  @Override
  public void onNestedPreScroll(View target, int dx, int dy, int[] consumed){
    dispatchNestedPreScroll(dx,dy,consumed,null);
  }
}

And then use this class in your layout.xml

<com.my.package.CustomNestedScrollView
    android:id="@+id/scroll"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior">

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">

   /*
       CONTENT
   */

</LinearLayout>
Arthur Lemoine
  • 200
  • 3
  • 9
Edijae Crusar
  • 3,473
  • 3
  • 37
  • 74
  • This did not work for me!! This is complex (at least for me) Also this seems to be a bit of overcoding. I solved this without doing all this.. I encourage you n readers to find easier ways. Because there are! – eRaisedToX May 04 '17 at 11:15