androidandroid-recyclerviewandroid-scrollviewandroid-scroll

Recyclerview inside ScrollView not scrolling smoothly


For my app I am using a RecyclerView inside a ScrollView where the RecyclerView has a height based on its content using this library. Scrolling is working but it's not working smoothly when I scroll over the RecyclerView. When I scroll over the ScrollView itself it is scrolling smoothly.

The code I am using to define the RecyclerView:

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

The RecyclerView in the 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" />

Solution

  • Try doing:

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

    As an alternative, you can modify your layout using the support design library. I guess your current layout is something like:

    <ScrollView >
       <LinearLayout >
    
           <View > <!-- upper content -->
           <RecyclerView > <!-- with custom layoutmanager -->
    
       </LinearLayout >
    </ScrollView >
    

    You can modify that to:

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

    However this is a longer road to take, and if you are OK with the custom linear layout manager, then just disable nested scrolling on the recycler view.

    Edit (4/3/2016)

    The v 23.2 release of the support libraries now includes a factory “wrap content” feature in all default LayoutManagers. I didn’t test it, but you should probably prefer it to that library you were using.

    <ScrollView >
       <LinearLayout >
    
           <View > <!-- upper content -->
           <RecyclerView > <!-- with wrap_content -->
    
       </LinearLayout >
    </ScrollView >