2019-06-27 RecyclerView滚动到指定位置置顶

1.调用滚动代码

recycler.smoothScrollToPosition(position)

2.设置滚动代码

recycler.layoutManager = ScrollSpeedLinearLayoutManger(mContext)

3.控制滚动速度源代码

package com.aimymusic.android.comm.ui.view.layoutmanager

import android.content.Context
import android.graphics.PointF
import android.support.annotation.Nullable
import android.support.v7.widget.*
import android.util.DisplayMetrics
class ScrollSpeedLinearLayoutManger(context: Context) :
  LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false) {

  var speed = 0.2f

  override fun smoothScrollToPosition(
    recyclerView: RecyclerView,
    state: RecyclerView.State?,
    position: Int
  ) {
    val smoothScroller = TopSmoothScroller(recyclerView.context)
    smoothScroller.targetPosition = position
    startSmoothScroll(smoothScroller)
  }

  private inner class TopSmoothScroller internal constructor(context: Context) :
    LinearSmoothScroller(context) {

    @Nullable
    override fun computeScrollVectorForPosition(targetPosition: Int): PointF? {
      return this@ScrollSpeedLinearLayoutManger.computeScrollVectorForPosition(targetPosition)
    }

    override fun calculateSpeedPerPixel(displayMetrics: DisplayMetrics): Float {
      return speed
    }

    override fun getVerticalSnapPreference(): Int {
      return LinearSmoothScroller.SNAP_TO_START
    }

    override fun getHorizontalSnapPreference(): Int {
      return LinearSmoothScroller.SNAP_TO_START
    }
  }
}

关键在于 getVerticalSnapPreference()的返回值,共有三种

public static final int SNAP_TO_START = -1; 
 public static final int SNAP_TO_END = 1;
 public static final int SNAP_TO_ANY = 0;

SNAP_TO_START使子视图的左侧或顶部与父视图的左侧或顶部对齐
SNAP_TO_END使子视图的右侧或底部与父视图的右侧面或底部对齐
SNAP_TO_ANY根据子视图的当前位置与父布局的关系,决定子视图是否从头到尾跟随
比如,如果子视图实际位于RecyclerView的左侧,SNAP_TO_ANY和SNAP_TO_START是没有差别的
默认值是SNAP_TO_ANY

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容