ListView 优化需要自定义 ViewHolder 和判断 convertView 是否为 null 。 而 RecyclerView 是存在规定好的 ViewHolder 。
2. 布局不同对于 ListView,只能在垂直的方向滚动。而对于 RecyclerView,他里面的 LayoutManager 中制定了一套可以扩展的布局排列接口,所以我们可以重写 LayoutManager 来定制自己需要的布局。RecycleView 可以根据 LayoutManger 有线性布局,瀑布流布局和网格布局。
- LinearLayoutManager,可以支持水平和竖直方向上滚动的列表。
- StaggeredGridLayoutManager,可以支持交叉网格风格的列表,类似于瀑布流或者Pinterest。
- GridLayoutManager,支持网格展示,可以水平或者竖直滚动,如展示图片的画廊。
recycleView 可以支持在添加,删除或者移动 Item 的时候,RecyclerView.ItemAnimator 添加动画效果,而listview不支持。而且RecyclerView 有四重缓存,而 ListView 只有二重缓存。ListView和RecyclerView最大的区别在于数据源改变时的缓存的处理逻辑,ListView是"一锅端",将所有的mActiveViews都移入了二级缓存mScrapViews,而RecyclerView则是更加灵活地对每个View修改标志位,区分是否重新bindView。
3.1 Listview 的二级缓存RecycleBin:大意就是通过两级缓存来缓存view。
(RecycleBin在layout的过程中便于view重用,RecycleBin有两级存储:ActiveViews和ScrapViews。
ActiveViews存储的是layout开始的时候屏幕上那些view。layout结束后,所有ActiveViews中的view被移动到ScrapViews中。
ScrapViews中的views是那些可能被adapter重新用到的view,以避免重新创建不必要的view。)
ActiveViews 一级缓存,顾名思义活动等view,这些view是布局过程开始屏幕上的view。layout开始时这个数组被填充,layout结束,ActiveViews中的view移动到 ScrapViews。ActiveViews代表了一个连续范围的views,其第一个view的位置存储在FirstActivePosition变量中。
ScrapViews 二级缓存,顾名思义废弃的view,无序的被adapter的convertView使用的view的集合 ScrapViews是多个list组成的数组,数组的长度为viewTypeCount,每个item是个list,所以每个list缓存不同类型item布局的 view
3.2 Recyclerview 的四级缓存RecycleView 的四级缓存是由三个类共同作用完成的,Recycler、RecycledViewPool和ViewCacheExtension。
Recycler 用于管理已经废弃或者与RecyclerView分离的ViewHolder,这里面有两个重要的成员
1.屏幕内缓存 一级缓存,屏幕内缓存指在屏幕中显示的ViewHolder,这些ViewHolder会缓存在AttachedScrap、ChangedScrap中
ChangedScrap —>表示数据已经改变的viewHolder列表
AttachedScrap—>表示未与RecyclerView分离的ViewHolder列表 2.屏幕外缓存 二级缓存,当列表滑动出了屏幕时,ViewHolder会被缓存在 CachedViews ,其大小由ViewCacheMax决定,默认DEFAULT_CACHE_SIZE为2,可通过Recyclerview.setItemViewCacheSize()动态设置。
RecycledViewPool 三级缓存, RecycledViewPool类是用来缓存ViewHolder用,如果多个RecyclerView之间用setRecycledViewPool(RecycledViewPool)设置同一个RecycledViewPool,他们就可以共享ViewHolder。
ViewCacheExtension 四级缓存, 开发者可自定义的一层缓存,是虚拟类ViewCacheExtension的一个实例,开发者可实现方法getViewForPositionAndType(Recycler recycler, int position, int type)来实现自己的缓存。
4. 自定义适配器ListView 的适配器继承 ArrayAdapter ;RecycleView 的适配器继承 RecyclerAdapter ,并将范类指定为子项对象类.ViewHolder (内部类)。
5. 绑定事件不同ListView 是在主方法中 ListView 对象的 setOnItemClickListener 方法;RecyclerView 则是在子项具体的 View 中去注册事件。