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特此感谢!

原文地址:https://www.cnblogs.com/qynprime/p/9284841.html

时间: 2024-10-08 13:32:26

RecyclerView滑动到指定位置,并置顶的相关文章

wordpress文章页获取指定分类的置顶文章

<dl> <dt><span>置顶</span>推荐</dt> <?php              query_posts('cat=28&posts_per_page=1'); while (have_posts()) : the_post();       if (is_sticky()): //输出置顶文章 ?> <dd> <p class="rList_title"><

鼠标滑动到指定位置时div固定在头部

$(function(){ $(window).scroll(function () {            if ($(window).scrollTop() > 253) {                $(".pagetab").css("position","fixed");                $(".pagetab").css("top","0");  

jquery实现点击按钮滑动到指定位置

<body> <script type="text/javascript"> function click_scroll() { var scroll_offset = $("#pos").offset(); //得到pos这个div层的offset,包含两个值,top和left $("body,html").animate({ scrollTop:scroll_offset.top //让body的scrollTop等于

横向滑动的HorizontalListView滑动指定位置的解决方法

项目中用到了自定义横向滑动的控件:HorizontalListView,点击其中一项,跳转到另外一个大图界面,大图界面也是HorizontalListView,想使用setSelection方法设定 项目中用到了自定义横向滑动的控件:HorizontalListView,点击其中一项,跳转到另外一个大图界面,大图界面也是HorizontalListView,想使用setSelection方法设定到点击的位置,却发现这个开源的代码没有实现这个方法.解决方法如下: 1.HorizontalListV

在UWP中页面滑动导航栏置顶

最近在研究掌上英雄联盟,主要是用来给自己看新闻,顺便copy个界面改一下段位装装逼,可是在我copy的时候发现这个东西 当你滑动到一定距离的时候导航栏会置顶不动,这个特性在微博和淘宝都有,我看了@ms-uap的文章,淘宝的实现方式是改变顶部显示栏的大小,我本来准备按照他那个思路去做的,但发现效果不理想,在滑动的时候,底部的界面也跟着在滑动,这样使得很不友好,所以我准备自己实现一个 先上个最终效果图吧,图比较大,请耐心等待 思路大概是这样的 将这个界面分为两行 <Grid.RowDefinitio

QQ好友列表向左滑动出现置顶、删除--第三方开源--SwipeMenuListView

SwipeMenuListView是在github上的第三方开源项目,该项目在github上的链接地址是:https://github.com/baoyongzhang/SwipeMenuListView . 下载后直接将项目包复制粘贴到需要的项目当中: 测试代码: item.xml: 1 <?xml version="1.0" encoding="utf-8"?> 2 <RelativeLayout xmlns:android="htt

【C语言】编写函数,将一个数的指定位置置0或置1

//编写函数,将一个数的指定位置置0或置1 #include <stdio.h> unsigned int set_bit(unsigned int num, int pos, int flag) { int n = 1; n = n << (pos - 1); //将n的第pos位置1,其它全为0 if (flag == 0) { num = num&(~n); } else if (flag == 1) { num = num | n; } else printf(&q

鼠标滑动一定距离的左侧菜单置顶效果

如图:上述实现的是鼠标向下滑动90px,左侧菜单整体上移置顶,而菜单在最开始便进行了定位,距离顶部90px 以下为实现这个效果的js代码: /*鼠标滑动一定距离的菜单效果*/ $(document).scroll(function() { var top=$(this).scrollTop(); console.log(top); if(top>90) { $(".sidebar").css("top","0"); } if(top<

【c语言】编写一个函数,这个函数可以将一个整数的指定位置1或置0

// 编写一个函数,这个函数可以将一个整数的指定位置1或置0 #include <stdio.h> int set_bit(int a, int pos, int flag) { int b = 1 << (pos - 1); if (flag == 0) { a &= ~b; } else { a |= b; } return a; } int main() { printf("%d\n", set_bit(2, 1, 1));// 3 printf(