StaggeredGridView 實現分析-首次填充過程(二)

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

相關文章
相關標籤/搜索