RecyclerView滑动到指定Position的方法

 更新时间:2017年04月06日 17:16:34   作者:陆羽_  
这篇文章主要为大家详细介绍了RecyclerView滑动到指定Position的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

Question

最近在写 SideBar 的时候遇到一个问题,当执行 Recyclerview 的 smoothScrollToPosition(position) 的时候,Recyclerview 看上去并没有滚动到指定位置。

Analysis

当然,这并不是方法的bug,而是 smoothScrollToPosition(position) 的执行效果有三种情况,需要区分。

·目标position在第一个可见项之前 。

这种情况调用smoothScrollToPosition能够平滑的滚动到指定位置,并且置顶。

·目标position在第一个可见项之后,最后一个可见项之前。

这种情况下,调用smoothScrollToPosition不会有任何效果···

·目标position在最后一个可见项之后。

这种情况调用smoothScrollToPosition会把目标项滑动到屏幕最下方···

Solution

鉴于这三种情况,我想大多数情况下都无法满足我们的滑动要求。为了实现 Recyclerview 把指定 item 滑动到屏幕顶端的需求,我们需要对上面三种情况分别处理。

 /** 目标项是否在最后一个可见项之后*/
 private boolean mShouldScroll;
 /** 记录目标项位置*/
 private int mToPosition;

 /**
 * 滑动到指定位置
 * @param mRecyclerView
 * @param position
 */
 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) {
 // 如果跳转位置在第一个可见位置之前,就smoothScrollToPosition可以直接跳转
 mRecyclerView.smoothScrollToPosition(position);
 } else if (position <= lastItem) {
 // 跳转位置在第一个可见项之后,最后一个可见项之前
 // smoothScrollToPosition根本不会动,此时调用smoothScrollBy来滑动到指定位置
 int movePosition = position - firstItem;
 if (movePosition >= 0 && movePosition < mRecyclerView.getChildCount()) {
 int top = mRecyclerView.getChildAt(movePosition).getTop();
 mRecyclerView.smoothScrollBy(0, top);
 }
 }else {
 // 如果要跳转的位置在最后可见项之后,则先调用smoothScrollToPosition将要跳转的位置滚动到可见位置
 // 再通过onScrollStateChanged控制再次调用smoothMoveToPosition,执行上一个判断中的方法
 mRecyclerView.smoothScrollToPosition(position);
 mToPosition = position;
 mShouldScroll = true;
 }
 }

再通过onScrollStateChanged控制再次调用smoothMoveToPosition

 mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
 @Override
 public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
 super.onScrollStateChanged(recyclerView, newState);
 if (mShouldScroll){
  mShouldScroll = false;
  smoothMoveToPosition(mRecyclerView,mToPosition);
 }
 }
 });
 }

目前这个解决方法有两个已知的问题

1、当目标项在最后一个可见项之后的时候,由于我们先执行smoothScrollToPosition方法,然后在OnScrollListener中执行smoothMoveToPosition方法,在滑动的时候不够连贯。
2、在手动滑动的时候执行该方法,会有极小的概率滑动的位置出现偏差。
如果你有更好解决办法,希望不吝指教。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Android挂断电话最新实现方法

    Android挂断电话最新实现方法

    大家好,本篇文章主要讲的是Android挂断电话最新实现方法,感兴趣的同学感快来看一看吧,对你有帮助的话记得收藏一下
    2022-02-02
  • Android APP性能优化分析

    Android APP性能优化分析

    这篇文章主要给大家讲了Android APP性能优化相关的思考以及优化重点分析,需要的朋友参考下吧。
    2017-12-12
  • Kotlin文件读写与SharedPreferences存储功能实现方法

    Kotlin文件读写与SharedPreferences存储功能实现方法

    SharedPreferences是安卓平台上一个轻量级的存储类,用来保存应用的一些常用配置,比如Activity状态,Activity暂停时,将此activity的状态保存到SharedPereferences中;当Activity重载,系统回调方法onSaveInstanceState时,再从SharedPreferences中将值取出
    2022-12-12
  • Android使用BottomNavigationBar实现底部导航栏

    Android使用BottomNavigationBar实现底部导航栏

    这篇文章主要为大家详细介绍了Android使用BottomNavigationBar实现底部导航栏,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-02-02
  • Android实现EditText换行自动缩进功能

    Android实现EditText换行自动缩进功能

    在很多需要输入多行文本的应用(如记事本、编程代码编辑器、博客编辑器等)中,自动缩进功能能大大提升用户的编辑效率与体验,本文给大家介绍了Android实现EditText换行自动缩进功能,下面提供整合后的完整代码示例,需要的朋友可以参考下
    2025-04-04
  • Android仿QQ长按删除弹出框功能示例

    Android仿QQ长按删除弹出框功能示例

    对于列表来说,如果想操作某个列表项,一般会采用长按弹出菜单的形式,默认的上下文菜单比较难看,而QQ的上下文菜单就人性化多了,整个菜单给用户一种气泡弹出的感觉,而且会显示在手指按下的位置,接下来通过本文给大家分享Android仿QQ长按删除弹出框功能,一起看看吧
    2017-03-03
  • Android自定义WaveProgressView实现水波纹加载需求

    Android自定义WaveProgressView实现水波纹加载需求

    这篇文章主要为大家详细介绍了Android自定义WaveProgressView实现水波纹加载需求,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-09-09
  • 常见Android选项菜单样式集合

    常见Android选项菜单样式集合

    这篇文章主要为大家分享了一份属于你自己的常见Android菜单样式集合,方便大家开发使用Android菜单,对OptionMenu感兴趣的小伙伴们可以参考一下
    2016-02-02
  • Android开发实现拨打电话与发送信息的方法分析

    Android开发实现拨打电话与发送信息的方法分析

    这篇文章主要介绍了Android开发实现拨打电话与发送信息的方法,结合实例形式分析了Android拨打电话及发送信息相关布局、功能实现及权限控制操作技巧,需要的朋友可以参考下
    2017-12-12
  • Android蓝牙服务启动流程分析探索

    Android蓝牙服务启动流程分析探索

    这篇文章主要介绍了Android蓝牙服务启动流程,了解内部原理是为了帮助我们做扩展,同时也是验证了一个人的学习能力,如果你想让自己的职业道路更上一层楼,这些底层的东西你是必须要会的
    2023-01-01

最新评论