(Smooth)ScrollToPosition doesn't work properly with RecyclerView

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

    In My case,

    `mRecyclerView.scrollToPosition(10);` 
    

    also did not work. But

    `mRecyclerView.smoothScrollToPosition(10);` 
    

    works fine for me...

    0 讨论(0)
  • 2020-12-03 04:53

    I also have same issue, but managed to fix the issue by Customizing SmoothScroller

    let Custom LayoutManager as below

    public class CustomLayoutManager extends LinearLayoutManager {
        private static final float MILLISECONDS_PER_INCH = 50f;
        private Context mContext;
    
        public CustomLayoutManager(Context context) {
            super(context);
            mContext = context;
        }
    
        @Override
        public void smoothScrollToPosition(RecyclerView recyclerView,
            RecyclerView.State state, final int position) {
    
            LinearSmoothScroller smoothScroller = 
                new LinearSmoothScroller(mContext) {
    
                //This controls the direction in which smoothScroll looks
                //for your view
                @Override
                public PointF computeScrollVectorForPosition
                (int targetPosition) {
                    return CustomLayoutManager.this
                        .computeScrollVectorForPosition(targetPosition);
                }
    
                //This returns the milliseconds it takes to 
                //scroll one pixel.
                @Override
                protected float calculateSpeedPerPixel
                    (DisplayMetrics displayMetrics) {
                    return MILLISECONDS_PER_INCH/displayMetrics.densityDpi;
                }
            };
    
            smoothScroller.setTargetPosition(position);
            startSmoothScroll(smoothScroller);
        }
    }
    

    (documentation commented inside the code given above)Please set the above LayoutManager to the recyerview

    CustomLayoutManagerlayoutManager = new CustomLayoutManager(getActivity());
    recyclerView.setLayoutManager(layoutManager);
    recyclerView.smoothScrollToPosition(position);
    

    by using the custom Layout manager

    scrollToPosition also working well in my case u can use

    recyclerView.scrollToPosition(position)
    

    also if you want to adjust the speed of smoothScrollToPosition please override the

    private static final float MILLISECONDS_PER_INCH = 50f;
    

    in CustomLayoutManager. So if we put the value as 1f the smoothScrollToPosition will be faster like scrollToPosition.increasing value make delay and decreasing will make the speed of scroll. Hope this will useful.

    0 讨论(0)
  • 2020-12-03 04:53

    when you use scrollToPosition it will show it on top of the recycler view.

    But if you use smoothScrollToPosition it will scroll till it come in to Window Visible. that's why while smoothScrool to item below, it will show it on bottom

    0 讨论(0)
  • 2020-12-03 04:57

    So i was looking for a solution to get back to the top with a recyclerview inside another layout that has a view on top of it (in my case I had a LinearLayout with a TextView and my recyclerview inside). Because of that the smoothscroll would go only to half the way to the first item.

    Here's what I did which works really well (Kotlin solution):

    back_to_top.setOnClickListener {
            GlobalScope.launch(Dispatchers.Main) {
                GlobalScope.launch(Dispatchers.Main) {
                    recyclerview.layoutManager?.smoothScrollToPosition(recyclerview, RecyclerView.State(), 0)
                    delay((recyclerview.layoutManager as LinearLayoutManager).findLastVisibleItemPosition() * 100L)
                }.join()
                recyclerview.scrollToPosition(0)
            }
            back_to_top.visibility = View.GONE
        }
    }
    

    Here what I do is I smoothscroll to the first element and delay the scroll by 100ms times the last item visible and then call the scrollToPosition(0) (which goes to the top.correctly)

    0 讨论(0)
  • 2020-12-03 05:00

    Finally I was able to make it work! LinearLayoutManager.scrollToPositionWithOffset(int, int) did the trick.

    0 讨论(0)
  • 2020-12-03 05:01

    Calling the recyclerView smoothScroll isn't effective, as the recyclerView itself doesn't handle its layout.

    What you should do is calling the layout manager scroll method instead.

    This should look something like this

    mRecyclerView.getLayoutManager().scrollToPosition(desiredPosition);
    
    0 讨论(0)
提交回复
热议问题