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滚动指定条目并在页面中居中相关推荐

  1. 如何实现标签元素在HTML页面中居中显示

    如何实现标签元素在HTML页面中居中显示 在HTML页面设计中常常需要实现标签元素在HTML页面中居中显示,相关知识点较多也较杂乱,本文试图介绍一些比较基本与实用的相关知识. 使用标签的align属性 ...

  2. 在html中如何使div在页面中居中显示

    在html中如何使div在页面中居中显示 最近无聊中又再温习了下html,发现好多东西都忘了.尝试着写了一个html网页,结果就连div如何在页面中居中显示都查了好久才弄出来.其实我不知道为什么这样可 ...

  3. html元素在模块中心显示,DW怎么设置DIV模块在页面中居中 DW如何设置网页打开绝对居中?...

    Dreamweaver(DW)中的div层怎么居中 Dreamweaver中div怎么页面居中? Dreamweaver中div怎么页面居中?我写的DIV都是靠左,怎么让它页面居中?在.header的 ...

  4. 如何让div在整个页面中居中?

    参考必应主页的样式,在页面中放置一个表格,100%宽高,然后表格内部是一个单元格,在单元格内部放置div,使其margin为auto即可. <table style="height: ...

  5. Java 技术篇 - 从指定的web网页页面中读取html内容实例演示,从http协议下的url地址中读取web页面内容方法

    实例为从我文章中读取标题. 通过 class 属性锁定标题元素,把匹配的内容打印出来. 下面是源码: package com.test.test;import java.io.*; import ja ...

  6. php获取页面指定内容,php 获取页面中的指定内容类

    功能: 1.获取内容中的url,email,image. 2.替换内容中的url,email,image. url:url">xxx email:admin@admin.com ima ...

  7. php获取页面中的指定内容,php 获取页面中指定内容的实现类

    [email protected] image: Grep.class.php /** grep class * Date: 2013-06-15 * Author: fdipzone * Ver: ...

  8. html页面居中怎么设置,实现div标签在html页面中居中的几种方式

    在制作网页的时候,我们会需要给div标签各种方式的居中布局,以下分享了几种常见的几种居中方式,以及居中的方法. 1.实现垂直居中 当标签元素为文本或图片时我们可以直接在父元素css中设置text-al ...

  9. html nav 置顶居中,如何让我的nav栏始终在页面中居中使用CSS3?

    而且我怎样才能让颜色伸展过去呢? (我知道我需要更改列表项目的背景颜色,但似乎没有其他工作). 这里是我的CSS代码: #nav {font-family: journalregular; width ...

最新文章

  1. 专访张宏江:撑开深度学习瓶颈,中国也有做出国际顶尖研究的环境
  2. android SharedPreferences设置初始密码,并修改密码
  3. Shell(4)——测试test、[]、逻辑、||文件-f、-d、-x、-eq、-gt、-ge、-lt、-le、-ne
  4. 2020年学python_Python学习路线图(2020年最新版)
  5. 2021年电竞营销行业半年度报告
  6. 外威客外包网站Elance
  7. 春运火车票开抢:打着“加速包”名号就算“合法黄牛”了吗?
  8. Android-第三天
  9. RocketMQ原理解析-producer 2.如何发送消息
  10. 三星5G先锋计划:0元起抢先换5G不是梦
  11. 工厂管理系统(java web前端和后端)
  12. python下载itchat失败_Python itchat库的使用,pythonitchat,方法,小记
  13. mac下查看.mobileprovision文件及钥匙串中证书.cer文件
  14. matlab accuracy 存,matlab 绘制caffe accuracy与loss曲线
  15. C语言中的指针加减偏移量
  16. vue的五个小实例解析其基础功能
  17. 设置单选框radio不可选(禁用)
  18. 中山大学数据科学与计算机学院复试分数线,2019中山大学数据科学与计算机学院考研复试分数线...
  19. 如何使用 Go 语言重新思考可视化编程?
  20. 直线的矢量方程之疑:一条直线到底由几个独立参数决定?

热门文章

  1. 风场可视化:风场数据
  2. 微信朋友圈装x代码_朋友圈生成器有哪些_微信朋友圈生成器大全_微信朋友圈装逼生成器下载_飞翔软件专题...
  3. Android8.0以上的Service、Notification和广播适配问题
  4. Springboot旅游管理系统 08841计算机毕业设计-课程设计-期末作业-毕设程序代做
  5. 【免费赠送源码】Springboot篮球网站19133计算机毕业设计-课程设计-期末作业-毕设程序代做
  6. 设计一个形状类(接口)Shape,方法:求周长和求面积形状类(接口)的子类(实现类):
  7. 用java的io方法扫描硬盘,JavaSE IO
  8. 工程师的基本功是什么?该如何练习?听听美团技术大咖怎么说
  9. 从零开始学R(三)——基本计算
  10. win7 设定固定的ip地址