版本:2.8.5
更多内容请看:http://cherylgood.cn
今天,我们来一起分析BaseRecyclerViewAdapterHelper中有关BaseQuickAdapter的源码,今天的分析思路是根据BaseQuickAdapter的实例化过程来进行分析。分析前我先分享一个RecyclerView.Adapter的生命周期方法图:
BaseQuickAdapter实例化第一步当然是调用我们的构造方法:
public BaseQuickAdapter(int layoutResId, List data) {
Log.d(TAG,"#test BaseQuickAdapter");
this.mData = data == null ? new ArrayList() : data;
if (layoutResId != 0) {
this.mLayoutResId = layoutResId;
}
}
public BaseQuickAdapter(List data) {
this(0, data);
}
public BaseQuickAdapter(int layoutResId) {
this(layoutResId, null);
}
从源码可以看到,我们的BaseQuickAdapter 有三个构造函数,但最终都会调用
public BaseQuickAdapter(int layoutResId, List data) {
Log.d(TAG,"#test BaseQuickAdapter");
this.mData = data == null ? new ArrayList() : data;
if (layoutResId != 0) {
this.mLayoutResId = layoutResId;
}
}
可以看到,加入你不传入data,内部会先为我们创建一个空的list,
然后在构造时记录我们的布局资源id。
那么,布局资源id会在什么时候用呢,当然是在onCreateViewHolder 方法中创建viewholder的时候,那么我没继续看onCreateViewHolder 方法的代码。而调用onCreteViewHolder前会先调用getItemViewType方法。
@Override
public int getItemViewType(int position) {
Log.d(TAG,"#test getItemViewType");
if (getEmptyViewCount() == 1) {
boolean header = mHeadAndEmptyEnable && getHeaderLayoutCount() != 0;
switch (position) {
case 0:
if (header) {
return HEADER_VIEW;
} else {
return EMPTY_VIEW;
}
case 1:
if (header) {
return EMPTY_VIEW;
} else {
return FOOTER_VIEW;
}
case 2:
return FOOTER_VIEW;
default:
return EMPTY_VIEW;
}
}
autoLoadMore(