一般我们用 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
特此感谢!

最新文章

  1. ABP(现代ASP.NET样板开发框架)系列之3、ABP分层架构
  2. POJ1351 Number of Locks(数学)
  3. [转帖] VS集成Qt环境搭建
  4. Java学习-031-JSON 之五 -- 特定数据获取(JSONObject满足特定键值)
  5. QT笔记之VS2010 Qt中导入qrc资源文件
  6. PASCAL的优越性:官方的说法(不需要Makefile,节约大量的时间)
  7. 【算法系列学习】状压dp [kuangbin带你飞]专题十二 基础DP1 D - Doing Homework
  8. 详解session
  9. qt Multimedia 模块类如何使用?
  10. C# -- 使用线程池 ThreadPool 执行多线程任务
  11. 洛谷P2762 太空飞行计划问题
  12. Cinema CodeForces - 670C (离散+排序)
  13. Android SurfaceView及TextureView对比
  14. splice的多种用法
  15. SGU---101 无向图的欧拉回路
  16. java-压缩文件成zip文件(多文件/单文件/多目录/单目录/无目录),用于下载
  17. mp4文件格式解析(转载)
  18. Kubernetes-运维指南
  19. Makedown语法说明
  20. 【转】Pro Android学习笔记(十一):了解Intent(中)

热门文章

  1. 中国剩余定理 CRT
  2. 用IntelliJ IDEA 开发Spring+SpringMVC+Mybatis框架 分步搭建一:建立MAVEN Web项目
  3. apache http跳转到https代码
  4. (二叉树 DFS 递归) leetcode 101. Symmetric Tree
  5. 静态IP设置
  6. array_slice()函数造成的一次sql注入
  7. JAVA实现C/S结构小程序
  8. 第十节:数据批注(DataAnnotationModel)和自定义验证(包括Model级别的验证)
  9. WEB内容换行
  10. java Concurrent并发容器类 小结