Solarex's Blog

我只想过,平平淡淡的生活,欲望啊,请放过脆弱的我

RecyclerView平滑滑动到指定位置

| Comments

最近在做一个周日历的新需求,其中有个要求是要RecyclerView平滑的滑动到指定位置,刚开始的时候我以为只要调用smoothScrollToPosition这个方法就可以了,测试的时候发现,smoothScrollToPosition只会对不可见的item有效,对于已经可见的item滑动没有效果,于是翻看了一下smoothScrollToPosition的源码,发现是调用了LayoutMangersmoothScrollToPosition方法。

1
2
3
4
5
6
7
8
9
// LinearLayoutManager
    @Override
    public void smoothScrollToPosition(RecyclerView recyclerView, RecyclerView.State state,
            int position) {
        LinearSmoothScroller linearSmoothScroller =
                new LinearSmoothScroller(recyclerView.getContext());
        linearSmoothScroller.setTargetPosition(position);
        startSmoothScroll(linearSmoothScroller);
    }

发现其实是实例化了一个LinearSmoothScroller,然后调用startSmoothScrollLinearSmoothScroller传入进去。在StackOverflow上看到一个回答,复写了getVerticalSnapPreference方法,返回SNAP_START,由于我的RecyclerView是水平滑动的,于是复写了getHorizontalSnapPreference返回SNAP_START,测试发现对可见的item也有滑动效果了,可是会有闪烁的现象。

继续看LinearSmoothScroller源码,发现有calculateSpeedPerPixel方法,默认是用25去计算,复写这个方法,换一个大点的数去计算,发现滑动的速度慢下来了,闪烁的现象消失了。具体的代码可以参考WeeklyCalendarView

问题虽然解决了,但是RecyclerView与各个插件的协同工作机制,LayoutManager,SmoothScroller原理没来的及分析,这个留待以后分析。

Comments