引言
上篇文章RecyclerView源码学习笔记(一)构造函数和setLayoutManager方法主要学习了RecyclerView初始化和setLayoutManager方法的源码,这篇我们学习setAdapter方法的源码
内容
setAdapter方法
按照我们平时最简单的使用习惯,在调用完setLayoutManager
方法之后就要调用setAdapter方法了,直接贴源码
/**
* Set a new adapter to provide child views on demand.
* <p>
* When adapter is changed, all existing views are recycled back to the pool. If the pool has
* only one adapter, it will be cleared.
*
* @param adapter The new adapter to set, or null to set no adapter.
* @see #swapAdapter(Adapter, boolean)
*/
public void setAdapter(@Nullable Adapter adapter) {
// bail out if layout is frozen
setLayoutFrozen(false);
setAdapterInternal(adapter, false, true);
processDataSetCompletelyChanged(false);
requestLayout();
}
代码不多,从注释来看这个方法的作用是
- 设置一个新的Adapter
- 所有已经存在的view将会被回收到pool中,如果pool只有一个adapter,那么这个pool将会被清空
上面提到的pool就是在前一篇RecyclerView源码学习笔记(一)构造函数和setLayoutManager方法中说的RecycledViewPool。
接下来一行一行看下去。第一行是调用了setLayoutFrozen(false)
,这个方法的作用是什么呢?从注释来看可以将此方法归纳为以下几点:
- 决定RecyclerView是否可以进行layout和scroll,如果参数是
true
,相当于这个RecyclerView被冻住了,那么layout的请求将被推迟,直到调用setLayoutFrozen(false)
- 当RecyclerView被冻住的时候,RecyclerView的
smoothScrollBy
,scrollBy
,scrollToPosition
,smoothScrollToPosition
这些方法的调用将直接被丢弃,也就是直接返回,这个我们可以看一下scrollBy
的源码,当判断到mLayoutFrozen
等于true
的时候就直接返回了,而这个mLayoutFrozen
就是在setLayoutFrozen
方法中被赋值的。
public void smoothScrollBy(@Px int dx, @Px int dy, @Nullable Interpolator interpolator) {
if (mLayout == null) {
Log.e(TAG, "Cannot smooth scroll without a LayoutManager set. "
+ "Call setL