RecyclerView应该是最常使用的几个Android原生组件了,深入了解RecyclerView的使用将是提升个人技能的必经之路。
首先我们通过三张效果图来看看ItemDecoration能做什么?第一张图仅添加了基础的分割线,第二张图添加了名次效果,第三张图则将各武将按照所属国家进行了分组显示,并针对分割线进行了些许调整。
实现分割线
针对第一张效果图,如果使用ListView的话,我们仅需添加以下两个属性即可实现分割线效果:
1 | android:divider="@android:color/darker_gray" |
可是现在ListView已经几乎被RecyclerView取代,而RecyclerView并不支持上述实现方式。那么如何在RecyclerView中实现分割线效果呢?答案是DividerItemDecoration
。DividerItemDecoration
是Android提供的类,专供实现分割线效果。
通过查看源代码,可以注意到DividerItemDecoration
默认会去寻找listDivider
属性。
1 | private static final int[] ATTRS = new int[]{ android.R.attr.listDivider }; |
在当前theme中设置该属性:
1 | <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> |
如果对分割线有颜色以及高度要求,也可以自定义shape来实现:
1 | <!-- styles.xml --> |
以上就是使用DividerItemDecoration
配合自定义shape来画分割线的基本流程,基本能完成简单的分割线绘制要求。但如果我们需要实现一开始图三的分割线,DividerItemDecoration
就无法实现了,因为它画出的分割线对于所有itemView来说是一样的,无法进行动态设定。如果是以前用ListView来实现该效果的话,通常会把不同的分割线画在item.xml里面,然后通过代码来动态判断显示哪一条:
1 | <!-- item.xml --> |
1 | if (显示长分割线) { |
但是通过该方式设置分割线,对代码具有较强的侵入性,UI和业务的耦合比较大,不符合通常的代码规范。也正是因为ListView在一系列的扩展与性能上都已经跟不上我们的设计要求的情况下,对RecyclerView的使用才变得越来越重要。
认识装饰器
ItemDecoration
字面翻译过来就是起到一个对RecyclerView每一行子布局的装饰效果。它不再满足于对简单线条的绘制,只要你会Canvas和自定义View简单使用,你就可以对Item绘制任何你想要的内容。
首先来认识一下ItemDecoration
类:
1 | public abstract static class ItemDecoration { |
根据定义我们大概知道这3个方法各自具有的功能:
onDraw
:将内容绘制在原先itemView的下方onDrawOver
:将内容绘制在原先itemView的上方getItemOffsets
:确定每个itemView的偏移距离
首先需要来看一下getItemOffsets
,确定了偏移距离,才能决定onDraw
和onDrawOver
的可绘制局域。