zoukankan      html  css  js  c++  java
  • RecyclerView滑动到指定位置,并置顶

    一般我们用 mRecycleview.smoothScrollToPosition(0)滑动到顶部,具有滚动效果,但是如果我们想滚动到任意指定位置,那么smoothScrollToPosition()就不能保证所指定item位于屏幕顶部,那么一下提供下我解决的方法:

    1.第一种方法

    此方法能实现指定位置位于屏幕顶部,但是不具有平滑滚动视觉效果:

     if (position != -1) {
                        mRecycleview.scrollToPosition(position);
                        LinearLayoutManager mLayoutManager =
                                (LinearLayoutManager) mRecycleview.getLayoutManager();这里的LinearLayoutManager对象只能是动态获取,不能用全局的。
     mLayoutManager.scrollToPositionWithOffset(position, 0); }

    2.第二种方法

    此方法能实现指定位置位于屏幕顶部,具有平滑滚动视觉效果:

    首先获取第一个可见位置和最后一个可见位置,分三种情况:

    1.如果如果跳转位置在第一个可见位置之前,就smoothScrollToPosition()可以直接跳转; 
    2.如果跳转位置在第一个可见项之后,最后一个可见项之前smoothScrollToPosition()不会滚动,此时调用smoothScrollBy来滑动到指定位置; 
    3.如果要跳转的位置在最后可见项之后,则先调用smoothScrollToPosition()将要跳转的位置滚动到可见位置,在addOnScrollListener()里通过onScrollStateChanged控制,调用smoothMoveToPosition,再次执行判断;

     //目标项是否在最后一个可见项之后
        private boolean mShouldScroll;
        //记录目标项位置
        private int mToPosition;
        /**
         * 滑动到指定位置
         */
        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) {
                // 第一种可能:跳转位置在第一个可见位置之前
                mRecyclerView.smoothScrollToPosition(position);
            } else if (position <= lastItem) {
                // 第二种可能:跳转位置在第一个可见位置之后
                int movePosition = position - firstItem;
                if (movePosition >= 0 && movePosition < mRecyclerView.getChildCount()) {
                    int top = mRecyclerView.getChildAt(movePosition).getTop();
                    mRecyclerView.smoothScrollBy(0, top);
                }
            } else {
                // 第三种可能:跳转位置在最后可见项之后
                mRecyclerView.smoothScrollToPosition(position);
                mToPosition = position;
                mShouldScroll = true;
            }
        }
     mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
                @Override
                public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                    super.onScrollStateChanged(recyclerView, newState);
                    if (mShouldScroll) {
                        mShouldScroll = false;
                        smoothMoveToPosition(irc, mToPosition);
                    }
                }
            });
    if (position != -1) {
                        smoothMoveToPosition(irc,position);
                    }else {
                        smoothMoveToPosition(irc,position+1);
                    }


    改文章出自:https://blog.csdn.net/shanshan_1117/article/details/78780137
    特此感谢!
  • 相关阅读:
    navicat常用快捷键与SQL基本使用
    【Excel实战】公式应用:如何按照某种类型数量排序
    Typora+Markdown便捷发布blog
    【Vulnhub】DC-2靶机
    【转载】阮一峰网络日志中的JWT入门
    【动态规划】闫氏dp分析
    Markdown Latex数学公式
    【每日一题】两个数组的交集
    【每日一题】前k个高频元素
    HashMap的各种遍历和删除方式总结
  • 原文地址:https://www.cnblogs.com/qynprime/p/9284841.html
Copyright © 2011-2022 走看看