@Override
  public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder;
    int type = getItemViewType(position);
    if (convertView == null) {
      holder = new ViewHolder();
      switch (type) {
        case TYPE_ITEM:
          convertView = mInflater.inflate(R.layout.fragment_subject_item, null);
          holder.titleView = (TextView) convertView.findViewById(R.id.text_subject_item_title);
          holder.dateView = (TextView) convertView.findViewById(R.id.text_subject_item_time);
          holder.roomView = (TextView) convertView.findViewById(R.id.text_subject_item_room);

          if (position % 2 == 0) {
            convertView.setBackgroundColor(
                context.getResources().getColor(R.color.abs__background_holo_dark));
          } else {
            convertView.setBackgroundColor(
                context.getResources().getColor(R.color.abs__background_holo_light));
          }

          break;
        case TYPE_SEPARATOR:
          convertView = mInflater.inflate(R.layout.fragment_subject_separator, null);
          holder.separatorView = (TextView) convertView.findViewById(R.id.text_subject_separator);
          break;
      }
      convertView.setTag(holder);
    } else {
      holder = (ViewHolder) convertView.getTag();
    }

    if (type == TYPE_ITEM) {
      final Events item = mData.get(position);

      if (item != null) {
        if (selection == item.getId()) {
          convertView.setBackgroundResource(R.drawable.abs__list_activated_holo);
          int padding = context.getResources().getDimensionPixelSize(R.dimen.default_list_padding);
          convertView.setPadding(padding, padding, padding, padding);
        } else {
          convertView.setBackgroundResource(android.R.color.transparent);
        }

        try {
          holder.titleView.setText(item.getSubjects().getTitle());
        } catch (Exception e) {
          Log.e(TAG, item.getSubjectId() + " " + item.getSubjects());
          HashMap<String, String> extraData = new HashMap<String, String>();
          extraData.put("subjectsid", String.valueOf(item.getSubjectId()));
          extraData.put("subjects", String.valueOf(item.getSubjects()));

          BugSenseHandler.sendExceptionMap(extraData, e);
        }

        holder.roomView.setText(item.getRoom());
        holder.dateView.setText(df.format(item.getStart()) + " - " + df.format(item.getEnd()));
      }

    } else {
      try {
        Calendar nextSeperatorDate = Calendar.getInstance();
        nextSeperatorDate.setTime(fullDateFormat.parse(getSeperatorItem(position)));

        long dateDiff = daysDiff(Calendar.getInstance(), nextSeperatorDate);

        if (dateDiff == 0) {
          holder.separatorView.setText(context.getString(R.string.text_today));
        } else if (dateDiff == 1) {
          holder.separatorView.setText(context.getString(R.string.text_tomorrow));
        } else if (dateDiff == -1) {
          holder.separatorView.setText(context.getString(R.string.text_yesterday));
        } else if (dateDiff == -2) {
          holder.separatorView.setText(context.getString(R.string.text_twoago));
        } else {
          holder.separatorView.setText(getSeperatorItem(position));
        }
      } catch (Exception e) {
        holder.separatorView.setText(getSeperatorItem(position));
        BugSenseHandler.sendException(e);
      }
    }
    return convertView;
  }