即一开始RecyclerView
中没有任何数据,添加数据源后adapter.notifyXXX
。状态变化如下图:
很明显在这种情形下Recycler
中是不会存在任何可复用的ViewHolder
。所以所有的ViewHolder
都是新创建的。即会调用Adapter.createViewHolder()和Adapter.bindViewHolder()
。那这些创建的ViewHolder
会缓存起来吗?
这时候新创建的这些ViewHolder
是不会被缓存起来的。 即在这种情形下: Recycler只会通过Adapter创建ViewHolder,并且不会缓存这些新创建的ViewHolder
情形二 : 在原有数据的情况下进行整体刷新
就是下面这种状态:
其实就是相当于用户在feed中做了下拉刷新。实现中的伪代码如下:
dataSource.clear()
dataSource.addAll(newList)
adapter.notifyDatasetChanged()
在这种情形下猜想Recycler
肯定复用了老的卡片(卡片的类型不变),那么问题是 : 在用户刷新时旧ViewHolder
保存在哪里? 如何调用旧ViewHolder
的Adapter.bindViewHolder()
来重新设置数据的?
其实在上一篇文章Recycler刷新机制
中,LinearLayoutManager
在确定好布局锚点View
之后就会把当前attach
在RecyclerView
上的子View
全部设置为scrap状态
:
void onLayoutChildren(RecyclerView.Recycler recycler, R