102

I am using RecyclerView inside NestedScrollView and it works. But when I use RecyclerView inside LinearLayout or something, it scroll in various speed depending on gesture. The scroll listen to gesture and if I slide up only a bit, then it scroll a little bit while if I slide up really fast, then it scroll really fast. Now my problem is that RecyclerView inside NestedScrollView certainly scroll but fast scroll does not work. However I slide up fast or slow, RecyclerView or NestedScrollView only scroll a little bit.

How can I make my NestedScrollView or RecyclerView inside that scroll view scroll in various speed?

3

11 Answers 11

268

try

recyclerView.setNestedScrollingEnabled(false); 
Sign up to request clarification or add additional context in comments.

10 Comments

But by this setting, recyclerview does not recycle views! what's your idea about it?
Actually I am adding two or more recycler views with different layout managers (such as Linear Layout and Grid Layout) inside my layout which also include banner, and other views. So to handle the recycler view like that, putting all of these inside the Nested Scroll View fix for me.
I dont know how this answer got so many upvotes. If disabling nested scroll then it is defeating it's purpose. What if I want to use nested scrolls and recycler?? Something like CoordinatorLayout, AppBarLayout and RecyclerView??
Thanks @JimitPatel , this is exactly my issue at the moment. I have a recycleview within a nestedscroll view and I can't scroll.stackoverflow.com/questions/41259756/…
@Karoly need to customize nested scrolls... I've that... Will post that in few hours... Currently, I'm traveling. I faced that issue in parallax effect with recycler view after toolbar.
|
54

By default setNestedScrollingEnabled works only after API-21.

You can use ViewCompat.setNestedScrollingEnabled(recyclerView, false); to disable nested scrolling for before and after API-21(Lollipop). Link to documentation.

Comments

22

I was working on android 16 where this was not possible to use setNestedSCrollEnabled method,

What I end up doing to stop RecyclerView from handling Scrolls.

Like in LinerLayoutManager i made canScrollHorizontally, canScrollVertically to return false by default.

myRecyclerView.setLayoutManager(new LinearLayoutManager(getContext(), LinearLayoutManager.VERTICAL, false){ @Override public boolean canScrollHorizontally() { return false; } @Override public boolean canScrollVertically() { return false; } }); 

1 Comment

This actually worked for me. I had a RecyclerView, inside a LinearLinear, inside a ScrollView.
11

After several iterations, I came up with a solution.

  1. If you are using RecyclerView, then:

    recyclerView.setNestedScrollingEnabled(false); 
  2. If you are using LinearLayout inside NestedScrollingView, take the LinearLayout inside a normal ScrollView and then set its scrolling to

    scrollView.setNestedScrollingEnabled(false); 

Comments

3

android:overScrollMode="never

 <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> 

Comments

1

You can use ScrollView with ExtendRecyclerView class that overrides the onMeasure method. That works for me!

@Override protected void onMeasure(int widthSpec, int heightSpec) { int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST); super.onMeasure(widthSpec, expandSpec); } 

Comments

1
recyclerView.setNestedScrollingEnabled(false); 

Will be useful sometimes.But it is not advisable for all the times.because it disables view recycling feature in recylcer view.

Alternatives:

Try CollapsiveToolbarLayout with Recycler view. put other views in collapsiveTollbar layout.

Comments

-2

I also met this problem. And upgrade to 26.1.0 fix it.

Comments

-2

In My Case i placed all images in drawable folder insted of drawable-xxxhdpi folder thats why my screen UI is lagging.

Comments

-3

This is WAI. The NestedScrollView measures its children with the Spec "Unspecified". The child can grow as much as it wants too.

This essentially equates the height of NSV and RV. So as far as the RV is concerned, it believes that it is completely displayed.

Wrap your RV with an LL and give your RV a height. The LL would not set the measure spec to be UNSPECIFIED so the RV would correctly scroll within its set height of whatever DPs you provide.

The only downside of this method is that you will not be able to do a match parent on your RV.

Comments

-4

You should wrap recycler view in any layout like LinearLayout and set RecyclerView size to constant, like 800dp. This will enable smooth scroll and recycler view will still recycler views during scroll.

<android.support.v4.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <android.support.v7.widget.RecyclerView android:layout_width="match_parent" android:layout_height="800dp" app:layout_behavior="@string/appbar_scrolling_view_behavior"/> </LinearLayout> 

1 Comment

This is a good answer because it points the way to fixing the fling scroll issue without breaking the RecyclerView's main benefit, loading only the visible views and recycling them when they are scrolled out of sight. People may have down-voted it because a fixed value like 800dp is not going to work in all screen sizes and orientations, but the layout_height value could be calculated and set programmatically - a bit messy, but it solves both issues.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.