(Smooth)ScrollToPosition doesn't work properly with RecyclerView

后端 未结 16 1301
既然无缘
既然无缘 2020-12-03 04:29

I\'m using basic RecyclerView with GridLayoutManager. I observed that nor smoothScrollToPosition nor scrollToPosition works properly.

a) when using smoothScrol

16条回答
  •  攒了一身酷
    2020-12-03 04:42

    How to perform smooth scrolling and save RecyclerView vertical position after device rotating: This is the method that works for my case,

    public class MainFragment extends Fragment { //OR activity it's //fragment in my case
        ....
     @Override
        public void onLoadFinished(@NonNull Loader> loader, List objects) { // or other method of your choice, in my case it's a Loader 
        RecyclerView recyclerViewRv = findViewById(........;
             .....
        recyclerViewRv.setAdapter(.....Your adapter);
    
                recyclerViewRv.addOnScrollListener(new RecyclerView.OnScrollListener() {
                    @Override
                    public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
                        super.onScrollStateChanged(recyclerView, newState);
                    }
    
                    @Override
                    public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
                        super.onScrolled(recyclerView, dx, dy);
                        recyclerScrollY = recyclerViewRv. computeVerticalScrollOffset();
                    }
                });
    
        //Apply smooth vertical scroll
        recyclerViewRv.smoothScrollBy(0,recyclerScrollY);
    }
        //Save vertical scroll position before rotating devices
        @Override
            public void onSaveInstanceState(@NonNull Bundle outState) {
                super.onSaveInstanceState(outState);
                outState.putInt("recyclerScrollY",recyclerScrollY);
            }
    
        //BackUp vertical scroll position after rotating devices 
        @Override
            public void onCreate(@Nullable Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                if(savedInstanceState != null) {
                    recyclerScrollY = savedInstanceState.getInt("recyclerScrollY");
                }
            }
    //If you want to perform the same operation for horizontal scrolling just add a variable called recyclerScrollX = recyclerScrollY = recyclerViewRv. computeHorizontalScrollOffset(); then save in bundle
    

提交回复
热议问题