/**
   * Counts the number of items that would be need to fill out the last row in the group of items
   * with the given header.
   *
   * @param header Header set of items are grouped by.
   * @return The count of unfilled spaces in the last row.
   */
  private int unFilledSpacesInHeaderGroup(int header) {
    // If mNumColumns is equal to zero we will have a divide by 0 exception
    if (mNumColumns == 0) {
      return 0;
    }

    int remainder = mDelegate.getCountForHeader(header) % mNumColumns;
    return remainder == 0 ? 0 : mNumColumns - remainder;
  }
  protected void updateCount() {
    mCount = 0;
    int numHeaders = mDelegate.getNumHeaders();
    if (numHeaders == 0) {
      mCount = mDelegate.getCount();
      mCounted = true;
      return;
    }

    for (int i = 0; i < numHeaders; i++) {
      mCount += mDelegate.getCountForHeader(i) + mNumColumns;
    }
    mCounted = true;
  }
  protected Position translatePosition(int position) {
    int numHeaders = mDelegate.getNumHeaders();
    if (numHeaders == 0) {
      if (position >= mDelegate.getCount()) {
        return new Position(POSITION_FILLER, 0);
      }
      return new Position(position, 0);
    }

    // Translate GridView position to Adapter position.
    int adapterPosition = position;
    int place = position;
    int i;

    for (i = 0; i < numHeaders; i++) {
      int sectionCount = mDelegate.getCountForHeader(i);

      // Skip past fake items making space for header in front of
      // sections.
      if (place == 0) {
        // Position is first column where header will be.
        return new Position(POSITION_HEADER, i);
      }
      place -= mNumColumns;
      if (place < 0) {
        // Position is a fake so return null.
        return new Position(POSITION_HEADER_FILLER, i);
      }
      adapterPosition -= mNumColumns;

      if (place < sectionCount) {
        return new Position(adapterPosition, i);
      }

      // Skip past section end of section row filler;
      int filler = unFilledSpacesInHeaderGroup(i);
      adapterPosition -= filler;
      place -= sectionCount + filler;

      if (place < 0) {
        // Position is a fake so return null.
        return new Position(POSITION_FILLER, i);
      }
    }

    // Position is a fake.
    return new Position(POSITION_FILLER, i);
  }
  @Override
  public int getCount() {
    if (mCounted) {
      return mCount;
    }
    mCount = 0;
    int numHeaders = mDelegate.getNumHeaders();
    if (numHeaders == 0) {
      mCount = mDelegate.getCount();
      mCounted = true;
      return mCount;
    }

    for (int i = 0; i < numHeaders; i++) {
      // Pad count with space for header and trailing filler in header
      // group.
      mCount += mDelegate.getCountForHeader(i) + unFilledSpacesInHeaderGroup(i) + mNumColumns;
    }
    mCounted = true;
    return mCount;
  }