How to save scroll position of RecyclerView in Android?

I have Recycler view which lays inside of SwipeRefreshLayout. Also, have ability to open each item in another activity.
After returning back to Recycler I need scroll to chosen item, or to previous Y.
How to do that?

Yes, I googled, found articles in StackOverFlow about saving instance of layout manager, like this one: RecyclerView store / restore state between activities.
But, it doesn’t help me.

  • Android - How to programmatically change timepicker mode?
  • ListViews - how to use ArrayAdapter.addAll() function before API 11?
  • Can't resize a RelativeLayout inside a ScrollView to fill the whole screen
  • Xml namespace declaration: auto-substitute package name
  • SSL/TLS protocols and cipher suites with the AndroidHttpClient
  • Android data-binding (similar to WPF)?
  • UPDATE

    Right now I have this kind of resolving problem, but, of course, it also doesn’t work.

    private int scrollPosition;
    
    ...//onViewCreated - it is fragment
    recyclerView.setHasFixedSize(true);
    LinearLayoutManager llm = new LinearLayoutManager(getActivity());
    recyclerView.setLayoutManager(llm);
    data = new ArrayList<>();
    adapter.setData(getActivity(), data);
    recyclerView.setAdapter(adapter);
    ...
    
    @Override
    public void onResume() {
        super.onResume();
        recyclerView.setScrollY(scrollPosition);
    }
    
    @Override
    public void onPause() {
        super.onPause();
        scrollPosition = recyclerView.getScrollY();
    }
    

    Yes, I have tried scrollTo(int, int) – doen’t work.

    Now I tried just scroll, for example, to Y = 100, but it doesn’t scrolling at all.

    Related posts:

    How to know whether I am in a call on Android?
    Saving user information in app settings
    Android : Floating Clickable Icon over Screen?
    Android private content provider?
    Turning on screen programmatically
    Note: android.support.v4.text.ICUCompatIcs: can&#039;t find dynamically referenced class libcore...
  • android button selector
  • app-release-unsigned.apk is not signed
  • android : set textView style at runtime
  • which would be the best to do make a horizontal scrolling app in android?
  • How to create RecyclerView with multiple view type?
  • How to remove a runnable from a handler object added by postDelayed?
  • 4 Solutions collect form web for “How to save scroll position of RecyclerView in Android?”

    Save the current state of recycle view position @onPause:

        positionIndex= llManager.findFirstVisibleItemPosition();
        View startView = rv.getChildAt(0);
        topView = (startView == null) ? 0 : (startView.getTop() - rv.getPaddingTop());
    

    Restore the scroll position @onResume:

        if (positionIndex!= -1) {
            llManager.scrollToPositionWithOffset(positionIndex, topView);
        }
    

    or another way can be @onPause:

    long currentVisiblePosition = 0;
    currentVisiblePosition = ((LinearLayoutManager)rv.getLayoutManager()).findFirstCompletelyVisibleItemPosition();
    

    restore @onResume:

    ((LinearLayoutManager) rv.getLayoutManager()).scrollToPosition(currentVisiblePosition);
    currentVisiblePosition = 0;
    

    User your recycler view linearlayoutmanager for getting scroll position

    int position = 0;
    if (linearLayoutManager != null) {
       scrollPosition = inearLayoutManager.findFirstVisibleItemPosition();
    }
    

    and when restoring use following code

    if (linearLayoutManager != null) {
      cardRecyclerView.scrollToPosition(mScrollPosition);
    }
    

    Hope this helps you

    You can use scrollToPosition or smoothScrollToPosition to scroll to any item position in RecyclerView.

    If you want to scroll to item position in adapter, then you would have to use adapter’s scrollToPosition or smoothScrollToPosition.

    A lot of these answers seem to be over complicating it.

    The LayoutManager supports onRestoreInstanceState out of the box so there is no need to save scroll positions etc. The built in method already saves pixel perfect positions.

    example fragment code (null checking etc removed for clarity):

    private Parcelable listState;
    private RecyclerView list;
    
    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    
        listState=savedInstanceState.getParcelable("ListState");
    
    }
    
    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
    
        outState.putParcelable("ListState", list.getLayoutManager().onSaveInstanceState());
    
    }
    

    then just call

    list.getLayoutManager().onRestoreInstanceState(listState);
    

    once your data has been reattached to your RecyclerView

    Android Babe is a Google Android Fan, All about Android Phones, Android Wear, Android Dev and Android Games Apps and so on.