RecyclerView滚动指定条目并在页面中居中
RecyclerView滚动指定条目并在页面中居中
内容提要
本次的需求是通过指定position来控制条目滚动,并且要滚动到指定到中间的位置。
下面先上图,看看是不是你要
如下介绍主要的步骤
带着问题去做需求是一个很不错的方式:
1.我们要滚动条目?怎么滚动呢?
2.滚动到指定的position是很容易,但是条目并没有到指定准确的位置,怎么办呢?
上面的两个问题解决了,我们的需求就完成了。
下面先解决第一个问题
这个很简单了,我就一笔带过好了啊。
recyclerView.scrollToPosition(trim);
你没看错就是这个方法。(手动滑稽)
然后是第二个问题
上图中的标号请无视。
这里要计算了,首先我们要先确定条目的位置,其次是将该条目移动到中间的位置。
将条目1,移动到箭头所在位置。
view1.getX();获取view1的x坐标(黄色到第一个蓝色的距离),获取view的宽度的一半(蓝色到绿色的距离),然后在获取外层view的宽度(我这是直接填充的屏幕宽度,黄色到第二个蓝色的距离),然后计算出view1需要移动的x距离。如下:
recyclerView.smoothScrollBy(changeX - (width - childWidth), 0);
计算看着比较简单,但是实际却需要做很多限制。以下注意事项:
1.首先RecyclerView的条目是要复用的,所以实际的view数目是屏幕上显示的,再多缓存一个或者两个view(可以通过getChildCount()方法获取数量),所以计算RecyclerView条目的时候要注意不要取到屏幕外的view,会造成空指针。
2.其次就是要注意position是否大于了缓存的view数目,如果大于我们就取最大的view角标;并且我们还要区分前后滚动,因为如果大于缓存的view数向后滚动就是就是取最大的view角标,如果小于缓存的view数向后滚动的话就直接取position作为角标的view了。
上面写的有点难懂,下面直接上代码,
if (trim > recyclerView.getChildCount() - 1) {if (oldInt > trim) {childAt = recyclerView.getChildAt(0);} else {childAt = recyclerView.getChildAt(recyclerView.getChildCount() - 1);}} else {if (oldInt > trim) {childAt = recyclerView.getChildAt(0);} else {childAt = recyclerView.getChildAt(trim);}}
结合代码看会比较容易。
遗留的问题
基本上处理好上面两个问题就可以达到我们的需求了,但是这里还有一个遗留的问题,就是关于界面显示的view数目和RecycledViewPool中view数目的关系。这里我是实验发现一般都会缓存一个view。所以在上面调用getChildAt()减去了1的,防止越界出现获取到空view的情况。
放出关键的代码部分,如果需要可以去文末下载demo
final int width = rect.right / 2;//角标数,不能大于页面最大的数目final Integer trim = Integer.parseInt(ed.getText().toString().trim());recyclerView.scrollToPosition(trim);mHandler.postDelayed(new Runnable() {@Overridepublic void run() {if (trim > recyclerView.getChildCount() - 1) {if (oldInt > trim) {childAt = recyclerView.getChildAt(0);} else {childAt = recyclerView.getChildAt(recyclerView.getChildCount() - 1);}} else {if (oldInt > trim) {childAt = recyclerView.getChildAt(0);} else {childAt = recyclerView.getChildAt(trim);}}changeX = (int) childAt.getX();childWidth = childAt.getMeasuredWidth() / 2;Log.d("x", changeX + "--" + recyclerView.getChildCount());recyclerView.smoothScrollBy(changeX - (width - childWidth), 0);}}, 50);mHandler.postDelayed(new Runnable() {@Overridepublic void run() {oldInt = trim;}}, 100);
finish
虽然需求看着很简单,但是涉及到的知识点还是很好,应该了解一下。
下载demo点这里
RecyclerView滚动指定条目并在页面中居中相关推荐
- 如何实现标签元素在HTML页面中居中显示
如何实现标签元素在HTML页面中居中显示 在HTML页面设计中常常需要实现标签元素在HTML页面中居中显示,相关知识点较多也较杂乱,本文试图介绍一些比较基本与实用的相关知识. 使用标签的align属性 ...
- 在html中如何使div在页面中居中显示
在html中如何使div在页面中居中显示 最近无聊中又再温习了下html,发现好多东西都忘了.尝试着写了一个html网页,结果就连div如何在页面中居中显示都查了好久才弄出来.其实我不知道为什么这样可 ...
- html元素在模块中心显示,DW怎么设置DIV模块在页面中居中 DW如何设置网页打开绝对居中?...
Dreamweaver(DW)中的div层怎么居中 Dreamweaver中div怎么页面居中? Dreamweaver中div怎么页面居中?我写的DIV都是靠左,怎么让它页面居中?在.header的 ...
- 如何让div在整个页面中居中?
参考必应主页的样式,在页面中放置一个表格,100%宽高,然后表格内部是一个单元格,在单元格内部放置div,使其margin为auto即可. <table style="height: ...
- Java 技术篇 - 从指定的web网页页面中读取html内容实例演示,从http协议下的url地址中读取web页面内容方法
实例为从我文章中读取标题. 通过 class 属性锁定标题元素,把匹配的内容打印出来. 下面是源码: package com.test.test;import java.io.*; import ja ...
- php获取页面指定内容,php 获取页面中的指定内容类
功能: 1.获取内容中的url,email,image. 2.替换内容中的url,email,image. url:url">xxx email:admin@admin.com ima ...
- php获取页面中的指定内容,php 获取页面中指定内容的实现类
[email protected] image: Grep.class.php /** grep class * Date: 2013-06-15 * Author: fdipzone * Ver: ...
- html页面居中怎么设置,实现div标签在html页面中居中的几种方式
在制作网页的时候,我们会需要给div标签各种方式的居中布局,以下分享了几种常见的几种居中方式,以及居中的方法. 1.实现垂直居中 当标签元素为文本或图片时我们可以直接在父元素css中设置text-al ...
- html nav 置顶居中,如何让我的nav栏始终在页面中居中使用CSS3?
而且我怎样才能让颜色伸展过去呢? (我知道我需要更改列表项目的背景颜色,但似乎没有其他工作). 这里是我的CSS代码: #nav {font-family: journalregular; width ...
最新文章
- 专访张宏江:撑开深度学习瓶颈,中国也有做出国际顶尖研究的环境
- android SharedPreferences设置初始密码,并修改密码
- Shell(4)——测试test、[]、逻辑、||文件-f、-d、-x、-eq、-gt、-ge、-lt、-le、-ne
- 2020年学python_Python学习路线图(2020年最新版)
- 2021年电竞营销行业半年度报告
- 外威客外包网站Elance
- 春运火车票开抢:打着“加速包”名号就算“合法黄牛”了吗?
- Android-第三天
- RocketMQ原理解析-producer 2.如何发送消息
- 三星5G先锋计划:0元起抢先换5G不是梦
- 工厂管理系统(java web前端和后端)
- python下载itchat失败_Python itchat库的使用,pythonitchat,方法,小记
- mac下查看.mobileprovision文件及钥匙串中证书.cer文件
- matlab accuracy 存,matlab 绘制caffe accuracy与loss曲线
- C语言中的指针加减偏移量
- vue的五个小实例解析其基础功能
- 设置单选框radio不可选(禁用)
- 中山大学数据科学与计算机学院复试分数线,2019中山大学数据科学与计算机学院考研复试分数线...
- 如何使用 Go 语言重新思考可视化编程?
- 直线的矢量方程之疑:一条直线到底由几个独立参数决定?
热门文章
- 风场可视化:风场数据
- 微信朋友圈装x代码_朋友圈生成器有哪些_微信朋友圈生成器大全_微信朋友圈装逼生成器下载_飞翔软件专题...
- Android8.0以上的Service、Notification和广播适配问题
- Springboot旅游管理系统 08841计算机毕业设计-课程设计-期末作业-毕设程序代做
- 【免费赠送源码】Springboot篮球网站19133计算机毕业设计-课程设计-期末作业-毕设程序代做
- 设计一个形状类(接口)Shape,方法:求周长和求面积形状类(接口)的子类(实现类):
- 用java的io方法扫描硬盘,JavaSE IO
- 工程师的基本功是什么?该如何练习?听听美团技术大咖怎么说
- 从零开始学R(三)——基本计算
- win7 设定固定的ip地址