Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android prevent nested recyclerview from automatically repositioning [duplicate]

I have a ViewPager as an item in a Linear Layout, with each item in the view pager containing a RecyclerView. The problem is, whenever the page initially loads, or when I change pages on the ViewPager, the view automatically scrolls so the beginning of the recycler view is the top of the screen, rather than staying how it is.

A .gif of the issue is here. Note I am not scrolling down, that is the automatic repositioning.

How can I prevent the view from automatically repositioning to the start of the recycler view?

like image 212
Kevin Grant Avatar asked Jun 13 '16 05:06

Kevin Grant


3 Answers

you can add this attribute to your linear layout. The Linear Layout direct child of your scrollView.

    android:descendantFocusability="blocksDescendants"
like image 163
Harshit Avatar answered Oct 26 '22 04:10

Harshit


I guess that the problem is not on your recyclerview but on your viewpager. ViewPager has setOffscreenPageLimit method that used to define offscreen page of your fragment attached to viewpager. if you have 3 fragment attached on viewpager, you can set its parameter like this

viePager.setOffscreenPageLimit(3); 

Whenever you change the pager page, its fragment would still on last state.

like image 33
ikhsanudinhakim Avatar answered Oct 26 '22 02:10

ikhsanudinhakim


We have a similar problem. We have a vertical RecyclerView. Each item of this vertical RecyclerView contains an horizontal RecyclerView, like in the Android TV app.

When we upgraded the support libs from 23.4.0 to 24.0.0 the automatic scroll suddenly appeared. In particular, when we open an Activity and we then go back, the vertical RecyclerView scrolls up so that the current horizontal RecyclerView row does not get cut and the row is displayed completely.

Adding android:descendantFocusability="blocksDescendants" fixes the issue.

However, I've found another solution, which also works. In our case the vertical RecyclerView is contained inside a FrameLayout. If I add android:focusableInTouchMode="true" to this FrameLayout, the problem goes away.

There's even a third solution mentioned here, which basically consists on calling setFocusable(false) on the child/inner RecyclerViews. I haven't tryied this.

By the way, there is an open issue on the AOSP.

like image 30
Albert Vila Calvo Avatar answered Oct 26 '22 04:10

Albert Vila Calvo