1, 上篇分析到了第一個view成功加入listView, 在步驟3中,咱們從 itemPos++ 開始,分析第二個view如何出現。java
while ((nextTop < end || hasSpaceDown()) && pos < mItemCount) { // TODO : add selection support // 目前不支持select , 因此selected一概爲false makeAndAddView(itemPos, nextTop, true, false); itemPos++; nextTop = getNextChildDownsTop(itemPos); // = child.getBottom(); }
此時 itemPos 的值是1,ide
2, getNextChildDownsTop 有兩個版本:this
//ExtendableListView.java protected int getNextChildDownsTop(final int itemPosition) { final int count = getChildCount(); return count > 0 ? getChildAt(count - 1).getBottom() : 0; } //StaggeredGridView.java /** * Get the top for the next child down in our view * (maybe a column across) so we can fill down. */ @Override protected int getNextChildDownsTop(final int itemPos) { if (isHeaderOrFooter(itemPos)) { return super.getNextChildDownsTop(itemPos); } else { return getHighestPositionedBottom(); //we assume there is no header view , so this branch is executed } }
getHighestPositionedBottom前面已經用到過,咱們假設有兩列, 第一列已經有了一個child view, 因爲第二列仍是空的,因此mColumnBottoms[1]的值是listView的 topPadding (沒有設置padding的話就是 0 了), 因此最終 獲得的nextTop的值是 0 或 topPaddingspa
接下來又要回到下次循環了, 調用makeAndAddView 加入第二個child view, code
makeAndAddView(1,topPadding,true, false ), 回到上篇分析的步驟3, 帶入這裏的參數就完成了第二個child view的加入過程。ci
如今總結一下,都有哪些變量發生了變化:get
mColumnBottoms[] , size = 2, 如圖,it
mPositionData[] ,size = 2, 分別記錄了數據項(來自adapter)0、1 對應的view的 column、 heightRatioio
接下來 nextTop值 是 上圖中的 mColumnBottoms[0], itemPos 自增爲2, 繼續重複這一過程,不斷用新的child view 將listView填滿 。class