@Override
  public void bindView(View view, final Context context, Cursor cursor) {
    ViewHolder viewHolder = (ViewHolder) view.getTag();

    MessageCache messageCache = DatabaseManager.getMessageCacheFromCursor(cursor);

    boolean ownMessage = isOwnMessage(messageCache.getSenderId());
    boolean friendsRequestMessage =
        FriendsNotificationType.REQUEST.equals(messageCache.getFriendsNotificationType());
    boolean friendsInfoRequestMessage =
        messageCache.getFriendsNotificationType() != null && !friendsRequestMessage;

    if (friendsRequestMessage) {
      viewHolder.messageTextView.setText(messageCache.getMessage());
      viewHolder.timeTextMessageTextView.setText(
          DateUtils.longToMessageDate(messageCache.getTime()));

      setVisibilityFriendsActions(viewHolder, View.GONE);
    } else if (friendsInfoRequestMessage) {
      viewHolder.messageTextView.setText(messageCache.getMessage());
      viewHolder.timeTextMessageTextView.setText(
          DateUtils.longToMessageDate(messageCache.getTime()));

      setVisibilityFriendsActions(viewHolder, View.GONE);

      lastInfoRequestPosition = cursor.getPosition();
    } else if (!TextUtils.isEmpty(messageCache.getAttachUrl())) {
      resetUI(viewHolder);

      setViewVisibility(viewHolder.progressRelativeLayout, View.VISIBLE);
      viewHolder.timeAttachMessageTextView.setText(
          DateUtils.longToMessageDate(messageCache.getTime()));
      displayAttachImage(messageCache.getAttachUrl(), viewHolder);
    } else {
      resetUI(viewHolder);

      setViewVisibility(viewHolder.textMessageView, View.VISIBLE);
      viewHolder.messageTextView.setText(messageCache.getMessage());
      viewHolder.timeTextMessageTextView.setText(
          DateUtils.longToMessageDate(messageCache.getTime()));
    }

    if (ownMessage && !friendsRequestMessage && !friendsInfoRequestMessage) {
      setMessageStatus(
          view,
          viewHolder,
          R.id.text_message_delivery_status_imageview,
          messageCache.isDelivered(),
          messageCache.isRead());
    }

    if (!messageCache.isRead() && !ownMessage) {
      messageCache.setRead(true);
      QBUpdateStatusMessageCommand.start(context, dialog, messageCache, true);
    }

    // check if last message is request message
    boolean lastRequestMessage =
        cursor.getPosition() == cursor.getCount() - 1 && friendsRequestMessage;
    if (lastRequestMessage) {
      findLastFriendsRequestForCursor(cursor);
    }

    // check if friend was rejected/deleted.
    if (lastRequestPosition != EMPTY_POSITION && lastRequestPosition < lastInfoRequestPosition) {
      lastRequestPosition = EMPTY_POSITION;
    } else if ((lastRequestPosition != EMPTY_POSITION
        && lastRequestPosition == cursor.getPosition())) { // set visible friends actions
      setVisibilityFriendsActions(viewHolder, View.VISIBLE);
      initListeners(viewHolder, messageCache.getSenderId());
    }
  }