Item不同的布局是在Adapter里面绑定的看┅下Adapter的实现。
- 瀑布流样式如果Item的布局文件是等高竖直方向,就是竖直方向的网格样式;如果Item是等宽水平方向,那就是水平方向的网络樣式
- 如果瀑布流样式的布局管理器StaggeredGridLayoutManager的spanCount设置为1竖直方向,是竖直方向的列表;水平方向就是水平方向的列表
这些功能在RecyclerView中都没有直接的接口,要自己实现(虽然实现起来很简单)因此如果只是实现简单的显示功能,ListView无疑更简单
- 默认已经实现了View的复用,不需要类似
if(convertView == null)
的实現而且回收机制更加完善。 - 容易实现添加item、删除item的动画效果
- 容易实现拖拽、侧滑删除等功能。
RecyclerView是一个插件式的实现对各个功能进行解耦,从而扩展性比较好
我们都知道ListView通过adapter.notifyDataSetChanged()
实现ListView的更新,这种更新方法的缺点是全局更新即对每个Item View都进行重绘。但事实上很多时候我們只是更新了其中一个Item的数据,其他Item其实可以不需要重绘
这里给出ListView实现局部更新的方法:
过程中,离屏的ItemView即被回收至缓存入屏的ItemView则会優先从缓存中获取,只是ListView与RecyclerView的实现细节有差异.(这只是缓存使用的其中一个场景还有如刷新等)
- mCacheViews的使用,可以做到屏幕外的列表项ItemView进入屏幕内时也无须bindView快速重用;
客观来说RecyclerView在特定场景下对ListView的缓存机制做了补强和完善。
缓存不同二者在缓存的使用上也略有差别,具体来說:
1). RecyclerView中mCacheViews(屏幕外)获取缓存时是通过匹配pos获取目标位置的缓存,这样做的好处是当数据源数据不变的情况下,无须重新bindView:
而同样是离屏缓存ListView从mScrapViews根据pos获取相应的缓存,但是并没有直接使用而是重新getView(即必定会重新bindView),相关代码如下:
由上文可知RecyclerView的缓存机制确实更加完善,但还不算质的变化RecyclerView更大的亮点在于提供了局部刷新的接口,通过局部刷新就能避免调用许多无用的bindView.
其中,onLayout()为重点分为三步:
ListView为了保证Item View的复用,实现了一套回收机制该回收机制的实现类是RecycleBin,他实现了两级缓存:
-
在一些场景下如界面初始化,滑动等ListView和RecyclerView都能很好地笁作,两者并没有很大的差异:
-
数据源频繁更新的场景如弹幕:等RecyclerView的优势会非常明显;
列表页展示界面,需要支持动画或者频繁更新,局部刷新建议使用RecyclerView,更加强大完善易扩展;其它情况(如微信卡包列表页)两者都OK,但ListView在使用上会更加方便快捷。
- Demo6: RecyclerView实现万能适配器瀑布流布局,嵌套滑动机制