(Smooth)ScrollToPosition doesn't work properly with RecyclerView

后端 未结 16 1036
既然无缘
既然无缘 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:38

    Actually, if you have a RecyclerView inside a NestedScrollView, you must use both of these lines every time you want to go to the beginning of the RecyclerView:

    nestedScrollView.smoothScrollTo(0, 0);
    layoutManager.scrollToPositionWithOffset(0, 0);
    

    This completely works for me.

    0 讨论(0)
  • 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<List<Report>> loader, List<Report> 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
    
    0 讨论(0)
  • 2020-12-03 04:44

    this worked for me

        Handler().postDelayed({
                        (recyclerView.getLayoutManager() as LinearLayoutManager).scrollToPositionWithOffset( 0, 0)
    
    }, 100)
    
    0 讨论(0)
  • 2020-12-03 04:47

    To scroll down smoothly to bottom from any position in the RecyclerView on clicking EditText.

    edittext.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    rv_commentList.postDelayed(new Runnable() {
                        @Override
                        public void run() {
                          rv_commentList.scrollToPosition(rv_commentList.getAdapter().getItemCount() - 1);
                        }
                    }, 1000);
                }
            });
    
    0 讨论(0)
  • 2020-12-03 04:47

    I was facing a weird issue wherein smoothScrollToPosition only worked occasionally.

    After putting the smoothScrollToPosition inside Handler Post Delayed with 1 second delay, it worked fine.

    Refer to the following Kotlin example:

    Handler().postDelayed({
    
       recyclerViewObject.smoothScrollToPosition(0) // mention the position in place of 0
    
    }, 1000) // 1000 indicates the 1 second delay.
    
    0 讨论(0)
  • 2020-12-03 04:49

    Try measuring item width or height and call smoothScrollBy(int dx, int dy).

    0 讨论(0)
提交回复
热议问题