RecyclerView滑动到指定位置,并指定位置在顶部

原创 2018年04月17日 14:04:38

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

1.第一种方法

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

 if (position != -1) {
                    mRecycleview.scrollToPosition(position);
                    LinearLayoutManager mLayoutManager =
                            (LinearLayoutManager) mRecycleview.getLayoutManager();
                    mLayoutManager.scrollToPositionWithOffset(position, 0);
                }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

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;
        }
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
 mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                super.onScrollStateChanged(recyclerView, newState);
                if (mShouldScroll) {
                    mShouldScroll = false;
                    smoothMoveToPosition(irc, mToPosition);
                }
            }
        });
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
if (position != -1) {
                    smoothMoveToPosition(irc,position);
                }else {
                    smoothMoveToPosition(irc,position+1);
                }
  • 1
  • 2
  • 3
  • 4
  • 5

Ok了,这样就可以实现了;

VB + API 获取 IE 的 "代理服务器" 配制

Option ExplicitPrivate Type INTERNET_PROXY_INFO    dwAccessType    As Long    lpszProxy       As Lon...
  • playyuer
  • playyuer
  • 2001-07-09 13:15:00
  • 1057

RecyclerView滑动到指定位置

如果使用的是LinearLayoutManager或StaggeredGridLayoutManager,它们都有一个scrollToPositionWithOffset(int position,i...
  • weixue9
  • weixue9
  • 2017-03-14 09:34:18
  • 1285

RecyclerView滚动到指定位置

滚动到指定位置recyclerView.scrollToPosition(position);平滑滚动到指定位置recyclerView.smoothScrollToPosition(position...
  • CSDN_LQR
  • CSDN_LQR
  • 2016-12-24 15:31:06
  • 16399

RecyclerView 滑动到指定位置

可以用 RecyclerView 的layoutManager  调用下边的方法 mLayoutManager.scrollToPositionWithOffset(newActiveVi...
  • lsw8569013
  • lsw8569013
  • 2016-12-25 15:05:45
  • 6056

RecyclerView 平滑滑动到指定位置

public class MainActivity extends AppCompatActivity implements RecyclerAdapter.OnItemClickListener {...
  • lsw8569013
  • lsw8569013
  • 2017-04-27 14:05:32
  • 1112

RecyclerView跳转到指定位置的三种方式

自从android5.0推出RecyclerView以后,RecyclerView越来越受广大程序员的热爱了!大家都知道RecyclerView的出现目的是为了替代listview和ScrollVie...
  • huangxiaoguo1
  • huangxiaoguo1
  • 2016-12-17 14:23:53
  • 23229

RecyclerView 滚动到指定position,并置顶

今天写页面有一个需求是这样的: 有一个广告条,显示2条广告信息并且,可以自动向上滚动。what? 2条看得我懵逼,一般我们看到的广告条都是一条一条切换,使用ViewFlipper就能够实现,但Vie...
  • x466911254
  • x466911254
  • 2017-11-13 23:17:09
  • 718

RecyclerView的滑动到指定位置

在我们很多项目中,一般列表页面的展示都用到了ListView或者是RecyclerView(其实一般现在的APP主页都是用RecyclerView了,它能完美的实现多布局),那么有时候会有滑到指定位置...
  • weixin_39535618
  • weixin_39535618
  • 2017-07-26 15:57:34
  • 738

RecycleView 滚动 平滑滚动到某位置

RecycleView 怎么平滑滚动到某位置;尝试兼对比小伙伴们提到的方法,先将个人认为的具体解决办法展示如下: RecyclerView.SmoothScroller smoothScroller...
  • lj489695332
  • lj489695332
  • 2017-07-08 16:48:29
  • 1584

RecyclerView滑动到指定Position的方法

Question 最近在写 SideBar 的时候遇到一个问题,当执行 Recyclerview 的 smoothScrollToPosition(position) 的时候,Recyclerview...
  • yangxi_001
  • yangxi_001
  • 2017-09-12 09:56:44
  • 732
收藏助手
不良信息举报
您举报文章:RecyclerView滑动到指定位置,并指定位置在顶部
举报原因:
原因补充:

(最多只允许输入30个字)