private void attachAdapter() {
    if (getHeight() == 0) {
      // try again!
      setAdapter(mAdapter);
      return;
    }

    final int itemCount = mAdapter.getCount();
    int itemGroup = mAdapter.getItemsCountPerGroup();
    if (itemGroup < 3) {
      itemGroup = 3;
    }

    final float height = getHeight();

    final int itemHeight = (int) (height / itemGroup);
    int additionHeight = (int) (height - itemHeight * itemGroup);

    int itemPosition = 0;
    final int totalItems = itemCount + 2;

    for (int i = 0; i < totalItems; i++) {

      if (i == 0 || i == totalItems - 1) {
        TextView tv = (i == 0 ? mStartBlankView : mEndBlankView);
        mItemLayoutParams.width = ViewGroup.LayoutParams.MATCH_PARENT;
        mItemLayoutParams.height = (--additionHeight >= 0) ? itemHeight + 1 : itemHeight;
        tv.setLayoutParams(mItemLayoutParams);
        mItemsContainer.addView(tv);
      } else {
        View convertView = null;
        boolean isCached = true;
        if (itemPosition < mCachedSubViewList.size()) {
          convertView = mCachedSubViewList.get(itemPosition);
        } else {
          isCached = false;
        }

        View view = mAdapter.getView(itemPosition, convertView, this);
        view.setId(mAdapter.getItemId(itemPosition));
        mItemLayoutParams.width = ViewGroup.LayoutParams.MATCH_PARENT;
        mItemLayoutParams.height = (--additionHeight >= 0) ? itemHeight + 1 : itemHeight;
        view.setLayoutParams(mItemLayoutParams);
        mItemsContainer.addView(view);

        if (!isCached) {
          mCachedSubViewList.add(itemPosition, view);
        } else {
          if (view != convertView) {
            mCachedSubViewList.remove(itemPosition);
            mCachedSubViewList.add(itemPosition, view);
          }
        }
        itemPosition++;
      }
    }
  }