缓存机制
ListView的RecycleBin机制
首先,你将会有一个view数组mActiveViews,还有一个ArrayList<View>的mScrapView,这两个的作用有什么用呢。列表展示数据的时候,假设有十条数据在屏幕上面,其他数据都在屏幕外面(也就是用户看不到的地方)。那么屏幕正在使用的这十条数据就会存储在mActiveViews中,里面的View只能被获取一次,如果移出屏幕后被废弃的view就会到mScrapView(这个时候已经没有pos信息和数据信息了)。当getview方法调用时,如果convertView不为空,就可以直接重用,从废弃的view中获得,但是要重新bindview。
这里引用Android ListView 与 RecyclerView 对比浅析—缓存机制的图片来说明listview的获取缓存过程
RecyclerView的缓存机制
RecyclerView有四级缓存,分别是mAttachedScrap(屏幕内缓存),mCacheViews(屏幕外的缓存),mViewCacheExtensions(自定义缓存),mRecycledViewPool(缓存池)。
缓存过程就是当我滑动屏幕时候,最近被移出屏幕外的viewholder就会放到mCacheViews上面,这个时候是含有pos信息和数据信息的,如果他满了且没有实现自定义缓存,就会把老的viewholder放到缓存池中,这个时候缓存池里面的是没有数据信息的,如果你要复用的话就要重新bindview。
如果我要获取缓存的话,就按顺序来读取,先去判断mAttachedScrap有没有,有的话直接拿来用,然后判断mCacheViews,接着判断自定义缓存。如果都没有再去缓存池里判断,没有的话就createViewHolder,有的话就bindViewHolder。
布局
- ListView只能竖着布局
- RecyclerView可以提供线性布局,网格布局,瀑布流布局,也可以选择竖着还是横着