用RecyclerView打造一个轮播图(进阶版)

用RecyclerView打造一个轮播图(进阶版),第1张

前几天写了篇 《用RecyclerView打造一个轮播图》 (以下简称基础版),看到有读者评论说相比Viewpager,用RecyclerView看起来没什么特别的优势。究其原因,目前只用到了RecyclerView最基础的一部分功能。其实相比Viewpager实现的轮播图,RecyclerView版的最大优势就在于它的灵活多变性,可定制性高。本篇文章将通过利用LayoutManger、SnapHelper等RecyclerView的辅助类来实现一系列更为炫酷的轮播图。

基础版中,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。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/11245930.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-14
下一篇 2023-05-14

发表评论

登录后才能评论

评论列表(0条)

保存