Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >给 RecyclerView 加上折叠的效果

给 RecyclerView 加上折叠的效果

作者头像
NanBox
发布于 2019-07-09 12:32:19
发布于 2019-07-09 12:32:19
1.5K00
代码可运行
举报
文章被收录于专栏:NanBoxNanBox
运行总次数:0
代码可运行

RecyclerView 有很高的自由度,可以说只有想不到没有做不到,真是越用越喜欢。这次用超简单的方法,让 RecyclerView 带上折叠的效果。

效果是这样的。

总结一下这个列表的特点,就是以下三点:

  1. 重叠效果;
  2. 层次感;
  3. 首项的差动。

下面我们来一个个解决。

我们新建一个 ParallaxRecyclerView,让它继承 RecyclerView,并使用 LinearLayoutManager 作为布局管理器。

重叠效果

其实就是每一项都搭一部分在它前面那项而已。我们知道,RecyclerView 可以通过设置 ItemDecoration 来实现列表的间隔效果,有没有想过要是把间隔设为负数会怎么样?比如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
addItemDecoration(new ItemDecoration() {
            @Override
            public void getItemOffsets(Rect outRect, View view, RecyclerView parent, State state) {
                super.getItemOffsets(outRect, view, parent, state);
                outRect.bottom = -dp2px(context, 10);
            }
        });
复制代码

没错,这就实现了我们的重叠效果。

层次感

在 Material Design 里是有Z轴这个概念的,我们可以给控件设置垂直于屏幕的高度,让不在同一高度的控件看起来有层次感。当然,我们要用 Material Design 的控件才有这个属性,这里我用的是 CardView。

我们给 ParallaxRecyclerView 增加一个滑动监听,在 onScrolled 方法里面做如下设置:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
LinearLayoutManager layoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
int firstPosition = layoutManager.findFirstVisibleItemPosition();
int lastPosition = layoutManager.findLastVisibleItemPosition();
int visibleCount = lastPosition - firstPosition;
//重置控件的高度
int elevation = 1;
for (int i = firstPosition - 1; i <= (firstPosition + visibleCount) + 1; i++) {
    View view = layoutManager.findViewByPosition(i);
    if (view != null) {
        if (view instanceof CardView) {
            ((CardView) view).setCardElevation(dp2px(context, elevation));
            elevation += 5;
        }
       
    }
}
复制代码

其中,setCardElevation 方法就是用来给 CardView 设置高度的,这里让每一项的高度比它的上一项高 5dp。

首项的差动

最后,我们想给第一项增加一个差动效果,这个同样在 onScrolled 方法里面做处理就好了:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
View firstView = layoutManager.findViewByPosition(firstPosition);
float firstViewTop = firstView.getTop();
firstView.setTranslationY(-firstViewTop / 2.0f);
复制代码

这样相当于第一项的滑动速度变成原来的一半。但这也会导致一个问题, 由于改变了控件的位置,当这个控件被复用时,会出现位置不正确的情况。所以我们在设置高度的时候,可以顺便把控件的位置复原了:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 float translationY = view.getTranslationY();
if (i > firstPosition && translationY != 0) {
    view.setTranslationY(0);
}
复制代码

这样就完成了一个带有简单折叠效果的 RecyclerView 了,妥妥的。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017年12月13日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
为RecyclerView添加下拉刷新功能
在之前的文章中,我们实现了带有header和footer功能的WrapRecyclerView:实现一个带有header和footer功能的RecyclerView
BennuCTech
2021/12/29
8820
为RecyclerView添加下拉刷新功能
实现一个带有header和footer功能的RecyclerView
RecyclerView是Android 5.0版本引入的一个新的组件,目的是在一些场景中取代之前ListView和GridView,实现性能更优的解决方案。同时RecyclerView的灵活性让它可胜任更多的场景。关于RecyclerView的使用有太多的文章了,大家可以自行搜索。
BennuCTech
2021/12/17
1.8K0
实现一个带有header和footer功能的RecyclerView
教你玩转 Android RecyclerView:深入解析 RecyclerView.ItemDecoration类(含实例讲解)
注意点1:Itemdecoration的onDraw()绘制会先于ItemView的onDraw()绘制,所以如果在Itemdecoration的onDraw()中绘制的内容在ItemView边界内,就会被ItemView遮挡住。如下图:
Carson.Ho
2019/02/22
2K0
RecyclerView 居然还能实现吸底效果
这些天遇到一个列表数据吸底需求,如果不满一屏就全部展示,如果超过一屏就让底部悬浮在屏幕底部。
程序亦非猿
2019/08/29
3.1K0
RecyclerView 居然还能实现吸底效果
RecyclerView定制:通用ItemDecoration及全展开RecyclerView的实现不同场景RecyclerView实现
Android L面世之后,Google就推荐在开发项目中使用RecyclerView来取代ListView,因为RecyclerView的灵活性跟性能都要比ListView更强,但是,带来的问题也不少,比如:列表分割线都要开发者自己控制,再者,RecyclerView的测量与布局的逻辑都委托给了自己LayoutManager来处理,如果需要对RecyclerView进行改造,相应的也要对其LayoutManager进行定制。本文主要就以以下场景给出RecyclerView使用参考: RecyclerVie
看书的小蜗牛
2018/06/29
2.6K0
Android RecyclerView 使用完全解析 体验艺术般的控件
RecyclerView出现已经有一段时间了,相信大家肯定不陌生了,大家可以通过导入support-v7对其进行使用。 据官方的介绍,该控件用于在有限的窗口中展示大量数据集,其实这样功能的控件我们并不陌生,例如:ListView、GridView。
wust小吴
2019/07/08
1.6K0
小甜点,RecyclerView 之 ItemDecoration 讲解及高级特性实践
毫无疑问,RecyclerView 是现在 Android 世界中最重要的系统组件之一,它的出现就是为了高效代替 ListView 和 GridView。当时它的出现解决了我一个大的需求,这个需求就是在电视盒子界面上横向加载应用列表,由于 ListView 没有横向加载的功能,而网络上开源的那些 HorizontalListView 又不满足需求,所以我们只能自定义 ViewGroup 来实现需求,但是回收机制不是很完善,所以性能并不好,所以当 RecyclerView 横空出世时,我第一时间拥抱了它,并推荐 Android 开发小组成员们去了解它。
Frank909
2019/01/14
1.1K0
RecyclerView addItemDecoration 的妙用 - item 间距平均分布和添加分割线
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/gdutxiaoxu/article/details/89387478
程序员徐公
2019/05/05
6.9K0
RecyclerView  addItemDecoration 的妙用 - item 间距平均分布和添加分割线
RecyclerView使用记录
随着公司自用app客户端功能&需求越来越复杂,某些页面的布局也越来越复杂。在前同事的建议下,使用RecyclerView来实现。
Ant丶
2022/03/01
4890
RecyclerView使用记录
使用 RecyclerView 实现 Gallery 画廊效果,并控制 Item 停留位置
RecyclerView 作为一个列表滑动控件,我们都知道它既可以横向滑动,也可以竖直滑动,可以实现线性布局管理,瀑布流布局管理,还有 GridView 布局管理。其实我们可以控制其 Item 的停留
非著名程序员
2018/02/09
3.8K0
使用 RecyclerView 实现 Gallery 画廊效果,并控制 Item 停留位置
RecycleView从0到0.1 | 技术创作特训营第一期
事件监听,项中小组件就通过holder获取,整体点击的话通过mAdapter.setOnItemClickListener。
宇宙无敌暴龙战士之心悦大王
2023/08/17
4450
Recyclerview返回顶部及分割线代码实现
//imageview 就是返回顶部的图像 调用recyclerView.smoothScrollToPosition(0);
用户4458175
2020/02/12
8270
RecyclerView 使用总结
自定义类继承 RecyclerView.ItemDecoration,重写回调方法
三流之路
2018/09/11
3.5K0
RecyclerView探索之通过ItemDecoration实现StickyHeader效果
我在上一篇《小甜点,RecyclerView 之 ItemDecoration 讲解及高级特性实践 》 讲解了 ItemDecoration 的基本用法及它的一些实践,抱着学习研究的态度,这一篇作为实践篇主要目的是尝试通过 ItemDecoration 来实现 RecyclerView 中的 StickyHeader 功能。
Frank909
2019/01/14
1.3K0
【Android】RecyclerView:打造悬浮效果
悬浮效果 先看个效果 效果 这是一个City列表,每个City都有所属的Province,需要在滑动的时候,将对应的Province悬浮在顶部。悬浮顶部的Province需要根据列表的滑动而
Gavin-ZYX
2018/05/18
3K0
滑动吸顶效果
需求是先滑动里面的列表,滑动到一个位置时外面滑动,外面滑动一段距离后再里面滑动。最初想用 CoordinatorLayout 加 RecyclerView,但效果不好直接用,或者用 NestedScrollView 与 RecyclerView 组合使用。
三流之路
2019/05/21
2.7K0
关于RecyclerView你知道的不知道的都在这了(下)目录正文
目录 由于本篇篇幅特长,特意做了个目录,让大伙对本篇内容先有个大概的了解。 另外,由于有些平台可能不支持 [TOC] 解析,所以建议大伙可借助本篇目录,或平台的目录索引进行快速查阅。 LayoutManager 1.1 LinearLayoutManager 基本效果介绍 findFirstCompletelyVisibleItemPosition() findFirstVisibleItemPosition() findLastCompletelyVisibleItemPosition() f
请叫我大苏
2018/07/05
1.3K0
Android开发之漫漫长途 XV——RecyclerView
该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列。该系列引用了《Android开发艺术探索》以及《深入理解Android 卷Ⅰ,Ⅱ,Ⅲ》中的相关知识,另外也借鉴了其他的优质博客,在此向各位大神表示感谢,膜拜!!!
LoveWFan
2018/08/07
2.3K0
Android开发之漫漫长途 XV——RecyclerView
一篇博客理解Recyclerview的使用
从Android 5.0开始,谷歌公司推出了RecylerView控件,当看到RecylerView这个新控件的时候,大部分人会首先发出一个疑问,recylerview是什么?为什么会有recylerview也就是说recylerview的优点是什么?recylerview怎么用?等等,下面我们将深入解析recylerview。
老马的编程之旅
2022/06/22
6960
一篇博客理解Recyclerview的使用
手把手教你用RecyclerView实现猫眼电影选择效果
在官方推出RecyclerView 控件之后,越来越多的人都使用它代替之前的ListView。除了最普通的列表显示,RecyclerView还可以其他的很多效果,例如Banner等。在最近的一个电影票平台项目中,使用RecyclerView实现了仿猫眼的电影选择控件,如下图所示:
北冥有鱼1991
2018/11/07
1.2K0
手把手教你用RecyclerView实现猫眼电影选择效果
推荐阅读
相关推荐
为RecyclerView添加下拉刷新功能
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验