How to make RecyclerView scroll smoothly?

前端 未结 9 1401
-上瘾入骨i
-上瘾入骨i 2020-12-30 21:16

This is more like a generic question, but after lot of search and try I am not able to understand why this is so difficult to achieve. This is the closest answer I can find

相关标签:
9条回答
  • 2020-12-30 22:04

    I made the scrolling smooth by overriding the calculateSpeedPerPixel(DisplayMetrics displayMetrics) method:

    public class CustomLayoutManager extends LinearLayoutManager {
    
        protected CenterLayoutManager(Context context, int orientation, boolean reverseLayout) {
            super(context, orientation, reverseLayout);
        }
    
        @Override
        public void smoothScrollToPosition(RecyclerView recyclerView, RecyclerView.State state, int position) {
            RecyclerView.SmoothScroller smoothScroller = new CenterSmoothScroller(recyclerView.getContext());
            smoothScroller.setTargetPosition(position);
            startSmoothScroll(smoothScroller);
        }
    
        private class CenterSmoothScroller extends LinearSmoothScroller {
    
            CenterSmoothScroller(Context context) {
                super(context);
            }
    
            @Override
            public int calculateDtToFit(int viewStart, int viewEnd, int boxStart, int boxEnd, int snapPreference) {
                return (boxStart + (boxEnd - boxStart) / 2) - (viewStart + (viewEnd - viewStart) / 2);
            }
    
            @Override
            protected float calculateSpeedPerPixel(DisplayMetrics displayMetrics) {
                return 0.5f; //pass as per your requirement
            }
        }
    }
    
    0 讨论(0)
  • 2020-12-30 22:08

    The typical source of "jerky" scrolling in Android is the app taking too much time on the main application thread updating the UI. In the case of RecyclerView, this would mean taking too much time in onBindViewHolder() or possibly in onCreateViewHolder(). Those each need to return in sub-millisecond times, meaning you cannot do disk I/O or network I/O in them.

    think I found the problem. I am using holder.photo.setImageBitmap(BitmapFactory.decodeFile(itemList.get(position).get‌​AbsolutePath())); on onBindViewHolder() and the image file is around 100kb each with about a dozen images in the list

    Yes, that will be doing disk I/O and image decoding on the main application thread. That will be slow enough to cause jank in the UI (i.e., "jerky" scrolling).

    Consider using an image loading library, like Picasso or Universal Image Loader, as they can populate your ImageView from the bitmap asynchronously.

    This sample app uses Universal Image Loader to help populate the contents of a RecyclerView (with GridLayoutManager), with the data source being the available videos on the device.

    0 讨论(0)
  • 2020-12-30 22:17

    Use a library as said by other comments in here. Also make sure you do not have Recyclerviews nested within a Scrollview. This was one of the reason why mine previously wasn't so smooth.

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