@Override
  protected void onItemAddedToList(int position, boolean flow) {
    super.onItemAddedToList(position, flow);

    if (isHeaderOrFooterPosition(position) == false) {
      Column col = getNextColumn(flow, position);
      mItems.append(position, col.getIndex());
    }
  }
  @Override
  protected void onAdjustChildViews(boolean down) {

    int firstItem = getFirstVisiblePosition();
    if (down == false && firstItem == 0) {
      final int firstColumnTop = mColumns[0].getTop();
      for (Column c : mColumns) {
        final int top = c.getTop();
        // align all column's top to 0's column.
        c.offsetTopAndBottom(firstColumnTop - top);
      }
    }
    super.onAdjustChildViews(down);
  }
  @Override
  protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    columnWidth =
        (getMeasuredWidth()
                - mListPadding.left
                - mListPadding.right
                - mColumnPaddingLeft
                - mColumnPaddingRight)
            / getColumnNumber();

    for (int index = 0; index < getColumnNumber(); ++index) {
      mColumns[index].mColumnWidth = columnWidth;
      mColumns[index].mColumnLeft = mListPadding.left + mColumnPaddingLeft + columnWidth * index;
    }

    mFixedColumn.mColumnLeft = mListPadding.left;
    mFixedColumn.mColumnWidth = getMeasuredWidth();
  }
 @Override
 protected void onLayout(boolean changed, int l, int t, int r, int b) {
   super.onLayout(changed, l, t, r, b);
   // TODO the adapter status may be changed. what should i do here...
 }