RecyclerView滑动到指定位置,并置顶
2024-10-10 11:57:36
一般我们用 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
特此感谢!
最新文章
- ABP(现代ASP.NET样板开发框架)系列之3、ABP分层架构
- POJ1351 Number of Locks(数学)
- [转帖] VS集成Qt环境搭建
- Java学习-031-JSON 之五 -- 特定数据获取(JSONObject满足特定键值)
- QT笔记之VS2010 Qt中导入qrc资源文件
- PASCAL的优越性:官方的说法(不需要Makefile,节约大量的时间)
- 【算法系列学习】状压dp [kuangbin带你飞]专题十二 基础DP1 D - Doing Homework
- 详解session
- qt Multimedia 模块类如何使用?
- C# -- 使用线程池 ThreadPool 执行多线程任务
- 洛谷P2762 太空飞行计划问题
- Cinema CodeForces - 670C (离散+排序)
- Android SurfaceView及TextureView对比
- splice的多种用法
- SGU---101 无向图的欧拉回路
- java-压缩文件成zip文件(多文件/单文件/多目录/单目录/无目录),用于下载
- mp4文件格式解析(转载)
- Kubernetes-运维指南
- Makedown语法说明
- 【转】Pro Android学习笔记(十一):了解Intent(中)
热门文章
- 中国剩余定理 CRT
- 用IntelliJ IDEA 开发Spring+SpringMVC+Mybatis框架 分步搭建一:建立MAVEN Web项目
- apache http跳转到https代码
- (二叉树 DFS 递归) leetcode 101. Symmetric Tree
- 静态IP设置
- array_slice()函数造成的一次sql注入
- JAVA实现C/S结构小程序
- 第十节:数据批注(DataAnnotationModel)和自定义验证(包括Model级别的验证)
- WEB内容换行
- java Concurrent并发容器类 小结