dhwani desai
dhwani desai

Reputation: 11

Recyclerview in fragment which is inside nestedscrollview scrolling issue

In activity, I have TabLayout & FrameLayout for loading fragment. fragment contains RecyclerView. it works fine for first time only. but when I change tab and back to previous tab the RecyclerView not scrolling full.

Main Activity

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

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

   <android.support.design.widget.TabLayout
       android:id="@+id/tabMain"
       android:layout_height="wrap_content"
       android:layout_width="match_parent" />

   <FrameLayout
       android:id="@+id/containerMain"
       android:layout_height="match_parent"
       android:layout_width="match_parent" />
   </LinearLayout>
 </android.support.v4.widget.NestedScrollView>

Fragment

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

   <android.support.v7.widget.RecyclerView
       android:id="@+id/rvMedia"
       android:layout_width="match_parent"
       android:layout_height="match_parent"
       android:nestedScrollingEnabled="false" />
</LinearLayout>

Upvotes: 1

Views: 1868

Answers (1)

David Kariuki
David Kariuki

Reputation: 1756

The recyclerView has a smooth scrolling by itself but when we need to put recyclerView within any scrollView it will not work like the below:

Layout XML

 <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent">

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

            <android.support.v7.widget.RecyclerView
                android:id="@+id/recyclerView"
                android:layout_width="match_parent"
                android:layout_height="wrap_content" />

        </LinearLayout>
    </ScrollView>
</LinearLayout>

The solution for this is we need to used nestedScrollView instead of scrollview like the below

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

   <android.support.v4.widget.NestedScrollView
        android:id="@+id/nestedScrollView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:overScrollMode="never">


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

            <android.support.v7.widget.RecyclerView
                android:id="@+id/recyclerView"
                android:layout_width="match_parent"
                android:layout_height="wrap_content" />

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

The problem occurs when we use nestedScrollView and put recyclerView inside nestedScrollView is, it scrolls in various speed depending on gesture. The scrolling feature will not be smooth.

So to fix this issue all you have to do after setting your adapter is to add this line ViewCompat.setNestedScrollingEnabled(recyclerView, false);

This is not a good solution. Placing a RecyclerView inside a NestedScrollView, causes ALL elements of the RecyclerView’s adapter to be rendered, ths using alot of memory. This can be so slow in most devices with less memory.

This approach might also lead to disabling need scrolling, which will disable views recycling thus all items will be initialized at once.e.g. In a list with 1000 items. This will make the application lag. You can avoid it if you use pagination where you load a fixed number of items when the user scrolls down on the list.

Read more about pagination.

Pagination with RecyclerView – Etienne Lawlor – Medium

Android RecyclerView Pagination with Paging Library using MVVM ...

Paging library overview | Android Developers

Upvotes: 0

Related Questions