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;
  }