RecyclerView in NestedScrollView layout without scrolling

I have a scrolling issue in RecyclerView inside NestedScrollView, next to CollapsingToolbarLayout.
The problem is that RecyclerView does not scroll or collapse ToolbarLayout 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 the help.

+6
source share
2 answers

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

+4
source

The reason is that NestedScrollView does not call the AppBarLayout.Behavour class when it receives scroll events from recyclerview. that is, when scrolling occurs in recyclerview, recyclerview sends / skips the scroll progress to NestedScrollView . NestedScrollView receives a scroll event, but does nothing with it.

Inside the nestedscrollview class

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

To overcome this and make appbarlayout an extension / crash when scrolling through recyclerview, simply create your own class that extends NestedScrollView and overrides the dispatchNestedPreScroll() method and call method described above that informs appbarlayout of the scroll event and allows it to 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> 
0
source

All Articles