private void onColumnSync(){
  int syncPosition=Math.min(mSyncPosition,getCount() - 1);
  SparseArray<Double> positionHeightRatios=new SparseArray<Double>(syncPosition);
  for (int pos=0; pos < syncPosition; pos++) {
    final GridItemRecord rec=mPositionData.get(pos);
    if (rec == null)     break;
    Log.d(TAG,"onColumnSync:" + pos + " ratio:"+ rec.heightRatio);
    positionHeightRatios.append(pos,rec.heightRatio);
  }
  mPositionData.clear();
  if (DBG)   Log.d(TAG,"onColumnSync column width:" + mColumnWidth);
  for (int pos=0; pos < syncPosition; pos++) {
    final GridItemRecord rec=getOrCreateRecord(pos);
    final double heightRatio=positionHeightRatios.get(pos);
    final int height=(int)(mColumnWidth * heightRatio);
    rec.heightRatio=heightRatio;
    int top;
    int bottom;
    if (isHeaderOrFooter(pos)) {
      top=getLowestPositionedBottom();
      bottom=top + height;
      for (int i=0; i < mColumnCount; i++) {
        mColumnTops[i]=top;
        mColumnBottoms[i]=bottom;
      }
    }
 else {
      final int column=getHighestPositionedBottomColumn();
      top=mColumnBottoms[column];
      bottom=top + height + getChildTopMargin(pos)+ getChildBottomMargin();
      mColumnTops[column]=top;
      mColumnBottoms[column]=bottom;
      rec.column=column;
    }
    if (DBG)     Log.d(TAG,"onColumnSync position:" + pos + " top:"+ top+ " bottom:"+ bottom+ " height:"+ height+ " heightRatio:"+ heightRatio);
  }
  final int syncColumn=getHighestPositionedBottomColumn();
  setPositionColumn(syncPosition,syncColumn);
  int syncToBottom=mColumnBottoms[syncColumn];
  int offset=-syncToBottom + mSpecificTop;
  offsetAllColumnsTopAndBottom(offset);
  mDistanceToTop=-syncToBottom;
  System.arraycopy(mColumnBottoms,0,mColumnTops,0,mColumnCount);
}

private void onColumnSync ( ) { int syncPosition = Math . min ( mSyncPosition , getCount ( ) - 1 ) ; SparseArray < Double > positionHeightRatios = new SparseArray < Double > ( syncPosition ) ; for ( int pos = 0 ; pos < syncPosition ; pos ++ ) { final GridItemRecord rec = mPositionData . get ( pos ) ; if ( rec == null ) break ; Log . d ( TAG , "onColumnSync:" + pos + " ratio:" + rec . heightRatio ) ; positionHeightRatios . append ( pos , rec . heightRatio ) ; } mPositionData . clear ( ) ; if ( DBG ) Log . d ( TAG , "onColumnSync column width:" + mColumnWidth ) ; for ( int pos = 0 ; pos < syncPosition ; pos ++ ) { final GridItemRecord rec = getOrCreateRecord ( pos ) ; final double heightRatio = positionHeightRatios . get ( pos ) ; final int height = ( int ) ( mColumnWidth * heightRatio ) ; rec . heightRatio = heightRatio ; int top ; int bottom ; if ( isHeaderOrFooter ( pos ) ) { top = getLowestPositionedBottom ( ) ; bottom = top + height ; for ( int i = 0 ; i < mColumnCount ; i ++ ) { mColumnTops [ i ] = top ; mColumnBottoms [ i ] = bottom ; } } else { final int column = getHighestPositionedBottomColumn ( ) ; top = mColumnBottoms [ column ] ; bottom = top + height + getChildTopMargin ( pos ) + getChildBottomMargin ( ) ; mColumnTops [ column ] = top ; mColumnBottoms [ column ] = bottom ; rec . column = column ; } if ( DBG ) Log . d ( TAG , "onColumnSync position:" + pos + " top:" + top + " bottom:" + bottom + " height:" + height + " heightRatio:" + heightRatio ) ; } final int syncColumn = getHighestPositionedBottomColumn ( ) ; setPositionColumn ( syncPosition , syncColumn ) ; int syncToBottom = mColumnBottoms [ syncColumn ] ; int offset = - syncToBottom + mSpecificTop ; offsetAllColumnsTopAndBottom ( offset ) ; mDistanceToTop = - syncToBottom ; System . arraycopy ( mColumnBottoms , 0 , mColumnTops , 0 , mColumnCount ) ; }
our mcolumntops and mcolumnbottoms need to be re - built up to the msyncposition - the following layout request will then layout the that position and then fillup and filldown appropriately .
