不知不觉安卓开发两年半,一直以来都是做着伸手党。从来没有尝试过分享自己的代码,或者将自己的搬砖心得记录下来写成博文。仔细想想,这种技术博文分享不论含金量高低,只要是自己用心的去记录梳理一遍,于人于己,多少都会有提高和帮助的。正好也为了响应新公司的要求,本月开始,坚持一月整理一篇!本人安卓半路出家,技术不咋地,所以会多从实际应用的角度出发来聊聊安卓相关的控件,开源库等。至于底层原理,框架内核方面有兴趣的可以自行查看源码。
闲话不多说,首先抛出一个问题
RecyclerView是什么?
个人理解:
RecyclerView={Listview+GridView+HorizonList+……}综合优化版
RecylerView是support-v7包中的新组件,是一个强大的滑动组件,与经典的ListView相比,同样拥有item回收复用的功能,这一点从它的名字
RecyclerView即回收view也可以看出。
对比Listview的优点:
1.标准化了View Holder,复用更加简单
2.显示效果更加灵活,一个LayoutManager类实现多种展示效果,并且常规的效果都有默认实现类,狂拽酷炫的效果自定义去实现。
3.酷炫到不可思议的Item动画效果(属性动画)
4.局部刷新机制,体验更好
5.更多,更灵活的监听接口,需求变态?毫不畏惧有木有
你想要控制其显示的方式,请通过布局管理器LayoutManager
你想要控制Item间的间隔(可绘制),请通过ItemDecoration
你想要控制Item增删的动画,请通过ItemAnimator
然后呢?
看了不少RecyclerView相关的文章,基本上都是一个套路,介绍完RecyclerView后立马就是上代码,,,那么既然我要自己写,肯定不能雷同,这里我直接上图!将实际项目中用到过RecyclerView的地方展示一下,还没用过的客官们可以自己想一下,这些效果如果让你用ListView实现能实现吗?实现起来的话大概是个什么代码量,会不会有坑,能不能跟RecyclerView一样实现起来简单又丝滑?
注:以下展示部分节选自经手的实际项目,其余为第三方框架提供的demo或在demo上进行的修改。
示例1:头部导航悬停
实现方式:实现RecyclerView.OnScrollListener,根据滚动状态做逻辑处理
核心实现代码:(HidingScrollListener extends RecyclerView.OnScrollListener)
1.判断第一个元素是否可见,如果可见则无论如何滑动也要显示出导航栏
2.当第一个元素不可见则根据当前滑动的这一小段距离(mScrolledDistance,正负表示向下,向上)对应的展示或者隐藏导航栏
3.外部recyclerview直接调用addOnScrollListener加载这个滚动监听就行
示例2:头部导航吸顶
实现方式:RecyclerView+开源库(PinnedHeaderItemDecoration)
参考链接:github.com/oubowu/PinnedSectionItemDecoration
示例3:多布局丝滑滚动
实现方式:无需处理滑动冲突等等,本人的实现是recycleview嵌套recycleview
核心代码:
可以看到,实际上主界面就是一个recyclerview,recyclerview的Adapter里面实现多布局,其实这些布局也是recyclerview,不管你要横向,竖直,瀑布流或者是多行并列,统统用recyclerview
示例4:简单的item飞入动画
实现方式:recycleview+属性动画
示例5:模仿支付宝头部渐变、回弹;多布局,上拉加载更多效果(重点是滑动丝滑)
实现方式:实现RecyclerView.OnScrollListener,计算头部滑动百分比,处理松手后的回弹等
核心代码:
跟例1类似,也是实现OnScrollListener监听,要说明的是判断滚动是否到达item一般高度后决定滚动到顶部或position1的位置的时候试过很多api,有的有bug(不够丝滑),如图,最终采用scrollBy的方式实现了丝滑的滚动
其实demo中还有很多酷炫的效果,只不过手机上录制到转gif再上传过程太麻烦,这里就省略啦,但是各位看官一定要明白,举这么多栗子真的就是想告诉你,recyclerview真的很强大!艺术般的控件!
最后放个大招,网上找到的一个很炫酷的Recyclerview的自定义LayoutManager,呈现的效果就是正六边形布局,图中的数字代表position,添加的位置以0为中心,顺时针的围成更大的正六边形!!好想有机会的项目里用一用啊!!
这里在原demo的基础上结合数列通项公式进行了改装,使得数据初始化能根据传入的i生成对应2i-1圈的数据,并且通过每圈的首尾元素互换实现了整圈旋转,效果看起来不错~
开源库:www.see-source.com/androidwidget/detail.html
好了,关于Recyclerview的介绍就到这里,本来很想细致的谈一些深层一点的如Recyclerview源码分析之类的东西,结果发现以目前的水平来写的话可能大篇幅的都需要“引用" ,"借鉴”了,不如不写。就纯粹的以实际接触到的这么点东西做一个简单的展示好啦。
最后的最后对目前还没有正式上手Recycleview的开发者介绍一个关于Recycleview 适配器的开源项目“BRVAH”,这个项目是干嘛的,有什么用这里就不做过多介绍。只说一句:BRVAH让我在使用Recycleview做开发的时候写起代码满是幸福感!(别人的评价,这里借用下,哈哈)
BRVAH官方:http://www.recyclerview.org/
github: https://github.com/CymChad/BaseRecyclerViewAdapterHelper