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
    特此感谢!
  • 相关阅读:
    禅道项目管理系统自定义菜单相关
    2015年技术方向转变计划
    LinuxMint 17.1 Cinnamon桌面窗口焦点bug
    通过指定函数/方法形参类型提高PHP代码可靠性
    Apache+Mod_Python配置
    JPHP最新进展 v0.6
    “领域驱动开发”实例之旅(1)--不一样的开发模式
    Key/Value之王Memcached初探:二、Memcached在.Net中的基本操作
    哈希值 是什么?哈希值是什么东西啊?具体怎么识别?怎么用?
    TortoiseGit 使用教程
  • 原文地址:https://www.cnblogs.com/qynprime/p/9284841.html
Copyright © 2011-2022 走看看