RecyclerView滑动到到具体position最佳方案

通过Android SDK提供的LinearSmoothScroller来实现的。

val smoothScroller = object : LinearSmoothScroller(this) {
   override fun getVerticalSnapPreference(): Int {
       return LinearSmoothScroller.SNAP_TO_START
   }
}

首先创建一个LinearSmoothScroller。重写getVerticalSnapPreference()返回SNAP_TO_START。

SNAP_TO_START的意思是指需要定位的position那个View的top和left和父布局(RecyclerView)的top和left对齐,也就是需要定位的position那个View出现在第一个可见位置。 同理,SNAP_TO_END的意思是指需要定位的position那个View出现在最后一个可见位置。

因为我们需要将position的View出现在第一个可见位置,所以getVerticalSnapPreference()方法我们返回SNAP_TO_START。

在需要跳转的地方,我们调用下面代码即可:

smoothScroller.targetPosition = position
recycler.layoutManager.startSmoothScroll(smoothScroller)

这种方案相比上面一种代码精简了不少,而且那种“滑动一下再滑动一下的现象”的现象也不存在。

如果觉得默认滑动速度比较突兀不够流畅的话,我们还可以将其的滑动速度调慢一点,让其滑动更平缓。重写LinearSmoothScroller的calculateSpeedPerPixel方法即可。

val smoothScroller = object : LinearSmoothScroller(this) {
   override fun getVerticalSnapPreference(): Int {
       return LinearSmoothScroller.SNAP_TO_START
   }
   override fun calculateSpeedPerPixel(displayMetrics: DisplayMetrics): Float {
       return 40F / displayMetrics.densityDpi
   }
}

calculateSpeedPerPixel的方法返回值是滑动每个像素所需要的时间(毫秒),默认是25F / displayMetrics.densityDpi。如果需要调慢一点可将这个值调大一点。可以根据实际体验,设置一个合适的值。

 

posted @ 2021-04-07 16:38  灰色飘零  阅读(1483)  评论(0)    收藏  举报