美文网首页
RecyclerView平滑滑动到item顶部

RecyclerView平滑滑动到item顶部

作者: 苏丶 | 来源:发表于2022-10-15 19:36 被阅读0次
    /**
         * 滑动到指定位置
         *
         * @param mRecyclerView
         * @param position
         */
        private void smoothMoveToPosition(RecyclerView mRecyclerView, final int position) {
            // 第一个可见位置
            int firstItem = mRecyclerView.getChildLayoutPosition(mRecyclerView.getChildAt(0));
            // 最后一个可见位置
            int lastItem = mRecyclerView.getChildLayoutPosition(mRecyclerView.getChildAt(mRecyclerView.getChildCount() - 1));
    
            if (position < firstItem) {
                // 如果跳转位置在第一个可见位置之前,就smoothScrollToPosition可以直接跳转
                mRecyclerView.smoothScrollToPosition(position);
            } else if (position <= lastItem) {
                // 跳转位置在第一个可见项之后,最后一个可见项之前
                // smoothScrollToPosition根本不会动,此时调用smoothScrollBy来滑动到指定位置
                int movePosition = position - firstItem;
                if (movePosition >= 0 && movePosition < mRecyclerView.getChildCount()) {
                    int top = mRecyclerView.getChildAt(movePosition).getTop();
                    mRecyclerView.smoothScrollBy(0, top);
                }
            } else {
                // 如果要跳转的位置在最后可见项之后,则先调用smoothScrollToPosition将要跳转的位置滚动到可见位置
                // 再通过onScrollStateChanged控制再次调用smoothMoveToPosition,执行上一个判断中的方法
                mRecyclerView.smoothScrollToPosition(position);
                mToPosition = position;
                mShouldScroll = true;
            }
        }
    

    监听

    binding.recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
                @Override
                public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                    super.onScrollStateChanged(recyclerView, newState);
                    if (mShouldScroll) {
                        mShouldScroll = false;
                        smoothMoveToPosition(binding.recyclerView, mToPosition);
                    }
                }
            });
    

    再使用即可

     smoothMoveToPosition(binding.recyclerView, mToPosition);
    

    相关文章

      网友评论

          本文标题:RecyclerView平滑滑动到item顶部

          本文链接:https://www.haomeiwen.com/subject/gdkkzrtx.html