recycleview定位到第一行

RecyclerView提供的用于控制移动的常用方法有3个 :

  • smoothScrollToPosition(int)
  • scrollToPosition(int)
  • scrollBy(int x,int y)

1.smoothScrollToPosition

该方法是平滑滚动,是可以看到item在屏幕滚动的状态。但是用于RecyclerView大量数据不理想,看源码:

public void smoothScrollToPosition(int position) {
        // ···省略无关代码,mLayout是该RecyclerView的LayoutManager对象
        mLayout.smoothScrollToPosition(this, mState, position);
    }

所以实际上是调用RecyclerView.LayoutManager.smoothScrollToPosition()方法,这是个抽象方法。由于笔者项目中是LinearLayoutManager于是找到其具体实现如下

        @Override
        public void smoothScrollToPosition(RecyclerView recyclerView,
                                           RecyclerView.State state, final int position) {

            LinearSmoothScroller smoothScroller = new LinearSmoothScroller(context);

            smoothScroller.setTargetPosition(position);
            startSmoothScroll(smoothScroller);
        }

生成一个RecyclerView.SmoothScroller的子类LinearSmoothScroller对象smoothScroller,接着利用smoothScroller去完成剩下的滑动工作。
看到这里很失望,没看到有效信息,于是进去LinearSmoothScroller看看。重大发现—里面有一个跟滑动速度相关的函数:

/**
     * Calculates the scroll speed.
     * 计算滑动速度
     * 返回:滑过1px所需的时间消耗。
     */
    protected float calculateSpeedPerPixel(DisplayMetrics displayMetrics) {
        // MILLISECONDS_PER_INCH是常量,等于20f
        return MILLISECONDS_PER_INCH / displayMetrics.densityDpi;
    }

从源码可以看出smoothScrollToPosition方法滚动每条都需要一定的时间,所以如果滚动的条目太多,屏幕会显示一直在滚动;

2.scrollToPosition

无滑动效果,这个方法的作用是显示指定项,就是把你想置顶的项显示出来,但是在屏幕的什么位置是不管的,只要那一项现在看得到了,那它就罢工了!如果需要指定的条目滚动到顶部位置,可以查考如下代码:

mRecycleview.scrollToPosition(position);
LinearLayoutManager mLayoutManager =  (LinearLayoutManager) mRecycleview.getLayoutManager();
mLayoutManager.scrollToPositionWithOffset(position, 0);

3.scrollBy

这个方法是自己去控制移动的距离,单位应该是像素。

 

你可能感兴趣的:(recycleview定位到第一行)