一般我们用 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() {@Overridepublic 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

RecyclerView滑动到指定位置,并置顶相关推荐

  1. 用startSmoothScroll实现RecyclerView滚动到指定位置并置顶,含有动画。

    RecyclerView滚动到指定位置并置顶 RecyclerView本身提供了几个定位的方法,除了手动滑动的scrollTo,smootScrollTo和scrollBy,smoothScrollB ...

  2. Android RecyclerView 滑动到指定位置 RecyclerView 滑动到顶部

    志在巅峰的攀登者,不会陶醉在沿途的某个脚印之中,在码农的世界里,优美的应用体验,来源于程序员对细节的处理以及自我要求的境界,年轻人也是忙忙碌碌的码农中一员,每天.每周,都会留下一些脚印,就是这些创作的 ...

  3. vue 监听滚动事件之菜单滚动吸顶点击滑动到指定位置点击高亮

    ###菜单滚动吸顶效果: ###html: <section class="switchModule" id="switchModule">< ...

  4. react native ScrollView实现滑动锚定,滑动到指定位置

    实现ScrollView滑动视图组件滑动到指定位置,实现tab与具体位置相锚定 给需要锚定的组件加上onLayout属性 //event.nativeEvent.layout.x是水平方向值,even ...

  5. zblog php 指定分类,zblogPHP如何调用指定分类的置顶文章

    站长圈子里可真是人人都是产品经理啊,各种奇葩的需求都会碰到,今天有个老哥就咨询我zblogphp程序如何调用指定分类的置顶文章,也不知道是应用在他网站的哪个模块区域了. 扯远了说正事,直接上代码{fo ...

  6. RecyclerView滚动到指定位置

    滚动到指定位置 recyclerView.scrollToPosition(position); 平滑滚动到指定位置 recyclerView.smoothScrollToPosition(posit ...

  7. 【AHK】鼠标调整窗口大小/移动窗口位置/窗口置顶/透明度

    通过AHK,设置窗体大小或位置,首先是两种鼠标调节窗体方案,后面是快捷键,注意修改快捷键的位置有两个,仿照Ubuntu调节窗体的快捷键 Alt+F7.Alt+F8,个人感觉比要按着ALT调节的小工具要 ...

  8. Vue 点击导航栏滑动到指定位置

    效果图: assignBlock.gif 方法1: <template><div class="hold"><!-- 跳转到指定模块 -->&l ...

  9. vue+element制作音乐播放器播放进度条bug(鼠标拖拽slider滑块滑动到指定位置无效)

    最开始bug还没解决时的效果图 bug解决后的效果图 项目场景: 想自己做一个基于vue仿网易云音乐的音乐网站,在制作播放器的时候用到了element ui里面的slider组件,制作完成后发现使用c ...

最新文章

  1. mysql另外加外键约束怎么写_mysql外键约束怎么写
  2. python进程socket通信_Python Socket TCP双端聊天功能实现过程详解
  3. java maven项目构建ssh工程 父工程与子模块的拆分与聚合
  4. 【算法基础】数据结构导论第六章-查找.pptx
  5. python里的shell是什么_python中的shell操作
  6. 如何使用 BenchmarkDotNet 对 C# 代码进行基准测试
  7. python——文本简单可逆加密
  8. shortcut switch in terminal start pos end pos
  9. mysql的常见命令与语法规范
  10. java2实用教程 第6版(课后习题总结)
  11. 同济大学《高等数学》上册答案
  12. 超市管理系统软件测试用例图,《天天超市管理系统》所有模块测试用例集.doc...
  13. 什么是浏览器指纹识别
  14. 解决微信屏蔽淘宝链接的方法
  15. 针孔相机模型,鱼眼相机模型,单目标定
  16. 第九周项目六 委派任务
  17. 2WD远程控制小车——云端设计
  18. 在微信小程序开发中遇见的bug及解决方案
  19. Linux USB基础之端点(二)
  20. 《VC++深入详解》第三章

热门文章

  1. 模板资源管理器的使用
  2. (转)字符型指针变量与字符数组的区别
  3. 通用机器学习流程与问题解决架构模板
  4. Message Loop 原理及应用
  5. lvs和keepalives
  6. 《Windows PowerShell实战指南(第2版)》——1.5 安装Windows PowerShell
  7. 【云栖大会】阿里云成为全国首家云等保试点示范平台
  8. BP神经网络基本原理
  9. Mdadm 设置管理
  10. ActiveX组件及其注册 (轉)