当我们使用Recylerview的时候总会用适配器,我们使用的方式经常会是这样
mLayoutManager = new LinearLayoutManager(this);
mRecyclerView.setLayoutManager(mLayoutManager);
// specify an adapter (see also next example)
mAdapter = new MyAdapter(myDataset);
mRecyclerView.setAdapter(mAdapter);
我们把data传入Adapter并为Recylerview设置适配器,在适配器里我们会implements methods:
- onCreateViewHolder(ViewGroup parent, int viewType)
当Recylerview需要一个新的ViewHolder的时候调用并给予item的viewType.- onBindViewHolder(VH holder, int position)
显示数据到ViewHolder.- getItemCount()
返回item的数量
我们先逆向的来看代码逻辑。
/**
* This method calls {@link #onCreateViewHolder(ViewGroup, int)} to create a new
* {@link ViewHolder} and initializes some private fields to be used by RecyclerView.
*
* @see #onCreateViewHolder(ViewGroup, int)
*/
public final VH createViewHolder(ViewGroup parent, int viewType) {
TraceCompat.beginSection(TRACE_CREATE_VIEW_TAG);
final VH holder = onCreateViewHolder(parent, viewType);
holder.mItemViewType = viewType;
TraceCompat.endSection();
return holder;
}
Recylerview.Adapter中
createViewHolder会调用onCreateViewHolder方法创建item视图
同理bindViewHolder会调用onBindViewHolder绑定ViewHolder显示数据。
/**
* This method internally calls {@link #onBindViewHolder(ViewHolder, int)} to update the
* {@link ViewHolder} contents with the item at the given position and also sets up some
* private fields to be used by RecyclerView.
*
* @see #onBindViewHolder(ViewHolder, int)
*/
public final void bindViewHolder(VH holder, int position) {
holder.mPosition = position;
if (hasStableIds()) {
holder.mItemId = getItemId(position);
}
holder.setFlags(ViewHolder.FLAG_BOUND,
ViewHolder.FLAG_BOUND | ViewHolder.FLAG_UPDATE | ViewHolder.FLAG_INVALID
| ViewHolder.FLAG_ADAPTER_POSITION_UNKNOWN);
TraceCompat.beginSection(TRACE_BIND_VIEW_TAG);
onBindViewHolder(holder, position, holder.getUnmodifiedPayloads());
holder.clearPayload();
TraceCompat.endSection();
}
createViewHolder和bindViewHolder的方法被Recylerview.Recyler的getViewForPostion方法调用
可以看到这个方法注释中含有
* This method should be used by {@link LayoutManager} implementations to obtain
* views to represent data from an {@link Adapter}.*/
这样就已知layoutManager会执行Recylerview的绘画过程。
我们再来找到LinearLayoutManager中有这样一个函数
验证了我们的猜想。
回顾
然后我们回头再来看getViewForPostion的逻辑,回顾前面我们已经知道getViewForPostion会依次调用createViewHolder和bindViewHolder的方法。当我们实际运用的时候,会使用多种布局,这个时候我们需要根据data使用不同的布局,即onCreateViewHolder根据传进来的ViewType创建不同的item布局。所以实际运用中我们都会重写方法
*public int getItemViewType(int position)
小结
- 由此我们知道getViewForPostion贯穿了单个View的创建
- 逻辑如下
- getViewType 获取View的布局类型.
- createViewHolder根据View的布局类型创建ViewHolder
- bindViewHolder 绑定布局,在上面显示数据信息。
- 逻辑如下
- Recylerview的绘画过程最终还是由 LayoutManager来执行。