之前有说过adapter如何跟listview产生联系,以及通知listview去全局刷新requestlayout。请参考 浅析listview及Adapter原理一。接下来就要看下全局刷新的时候跟adapter之间又做了什么交互?
(1) listview测量过程中与adapter交互
全局刷新就会调用到视图的onMeasure,onLayout,onDraw流程。我们参考下listview的部分源码段如下:
OnMeasure():
if (heightMode == MeasureSpec.AT_MOST) {
// TODO: after first layout we should maybe start at the first visible position, not 0
heightSize = measureHeightOfChildren(widthMeasureSpec, 0, NO_POSITION, heightSize, -1);
}
measureHeightOfChildren():
for (i = startPosition; i <= endPosition; ++i) {
child = obtainView(i, isScrap);
child = obtainView(i, isScrap);
measureScrapChild(child, i, widthMeasureSpec);
}
!!!obtainView就是创建子view的场所:
scrapView = mRecycler.getScrapView(position);
View child;
if (scrapView != null) {
child = mAdapter.getView(position, scrapView, this);
if (scrapView != null) {
child = mAdapter.getView(position, scrapView, this);
}else{
child = mAdapter.getView(position, null, this);
}
}
这个地方,adapter.getView去获取视图(同时listview中有缓存模块RecyclerBin记录所缓存的视图),稍后接受recyclebin大致缓存策略。
!!!:measureScrapChild()方法:
LayoutParams p = (LayoutParams) child.getLayoutParams();
if (p == null) {
p = (AbsListView.LayoutParams) generateDefaultLayoutParams();
child.setLayoutParams(p);
}
p.viewType = mAdapter. getItemViewType(position);
p.force
if (p == null) {
p = (AbsListView.LayoutParams) generateDefaultLayoutParams();
child.setLayoutParams(p);
}
p.viewType = mAdapter. getItemViewType(position);
p.force