• 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
    特此感谢!
  • 相关阅读:
    MySQL 中 where id in (1,2,3,4,...) 的效率问题讨论
    创建,增加,删除mysql表分区
    mysql分区及实例演示
    MySQL的表分区详解
    MySQL 存储过程传参之in, out, inout 参数用法
    MySQL里面的子查询实例
    超详细mysql left join,right join,inner join用法分析
    MySQL force Index 强制索引概述
    MyISAM和InnoDB的索引在实现上的不同
    java中的守护线程
  • 原文地址:https://www.cnblogs.com/qynprime/p/9284841.html
Copyright © 2020-2023  润新知