基础版中,RecyclerView设置了默认横向的 LinearLayoutManager :
LinearLayoutManager indicatorLayoutManager = new LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false)
那么我们再来加个属性:
同时在布局文件中设置 app:orientation="vertical" ,让 LinearLayoutManager 的布局方向变为竖直(为了保持统一,标示点布局方向跟随滑动方向),就是这么简单,一款竖直滑动的无限轮播图就打造完成了!
之前有篇文章 ViewPager系列之 仿魅族应用的广告BannerView ,不过这是用ViewPager实现的,那我们就来个RecyclerView版的,而实现重点的就在于自定义LayoutManger(如果不太了解这部分的知识,请先移步学习下(╯︵╰))。
这次先上成果图,再慢慢分析:
以上的效果仅仅是换了一个LayoutManger和一个itemview(为了显示效果,imageview外面套了cardview)。
首先我们做准备工作,定义几个常量:
自定layoutmanager第一步当然是实现唯一必须要实现的方法:
然而并没有什么用,99%的自定义 LayoutManager 都是这么写的,因为我们没有把view添加到 RecyclerView中。所以接下来就是重写 onLayoutChildren() 来进行布局,这个方法的作用相当于普通Viewgroup中的 onLayout() 方法,在RecyclerView滚动,数据改变等情况都会调用此方法来重新布局。
具体的布局方法,主要就是:回收不可见的itemview,遍历可见的itemview进行位置计算并放置:
接下来是处理滚动,让recyclerview可以滚动起来:
因为在我们在布局和滚动时考虑了横向和竖向的情况,所以设置竖直的无限轮播图也很简单:
new BannerLayoutManager(BannerLayoutManager.VERTICAL, Util.dp2px(10))
(方向竖直,图片间距10dp,默认放大1.2倍)
看到这,我想大家都能看到用RecyclerView实现无限轮播图的强大的之处了吧:
adapter可以处理itemview布局和无限轮播; LayoutManager 可以处理整体布局和滑动动画;SnapHelper可以让itemview滑动起来像viewpager一样(一般用自带的 PagerSnapHelper 就行了)。
而上面的所有动画效果仅仅都是通过改动 LayoutManager ,然后再通过设置不同itemview,就可以做出各种不同效果。最后感谢以下文章提供 LayoutManager 的实现思路。
http://blog.csdn.net/zxt0601/article/details/52956504
http://www.jianshu.com/p/7bb7556bbe10
以前使用RecyclerView的时候基本没受RecyclerView复用的影响,最近在RecyclerView中用Glide加载图片的时候发现RecyclerView滑动的时候RecyclerView复用导致了ImageView显示图片先是被复用的item应该显示的图片,然后才加载该位置的item该显示的图片。经过两三天的百度,发现最有效的方法是在Adapter的onCreateViewHolder里先给ImageView 设置一个占位符,再进行加载图片,这样图片混乱的问题是解决了,但是滑动RecyclerView的时候所有的item都要经历由占位符到图片的过程,所以我就想给RecyclerView来个预加载,就给RecyclerView设置了setItemViewCacheView,这样问题就解决了。抱着试试的心态,我把ImageView 的占位符去掉了,结果效果依旧完美。所以要解决复用造成的图片混乱,只要给RecyclerView设置setItemViewCacheSize就OK。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)