private JSONObject getJSonFormMessage(Message msg) {
    String contentText = "";
    String msgType = ""; // 上传给js 层的类型,请和ios 保持一致

    switch (msg.getContentType()) {
      case text:
        contentText = ((TextContent) msg.getContent()).getText();
        msgType = "text";
        break;
      default:
        break;
    }
    Log.i(TAG, "msg " + contentText);

    JSONObject jsonItem = new JSONObject();
    try {
      MessageContent content = msg.getContent();
      UserInfo targetUser = (UserInfo) msg.getTargetInfo();
      UserInfo fromUser = (UserInfo) msg.getFromUser();

      jsonItem.put("target_type", "single");
      jsonItem.put("target_id", targetUser.getUserName());
      jsonItem.put("target_name", targetUser.getNickname());
      jsonItem.put("from_id", fromUser.getUserName());
      // jsonItem.put("from_name", fromUser.getNickname());
      jsonItem.put("from_name", msg.getFromName());
      jsonItem.put("create_time", msg.getCreateTime());
      jsonItem.put("msg_type", msgType);
      // jsonItem.put("text", contentText);

      JSONObject contentBody = new JSONObject();
      contentBody.put("text", contentText);
      jsonItem.put("msg_body", contentBody);

    } catch (JSONException e) {
      e.printStackTrace();
    }
    return jsonItem;
  }
  /** 显示时间 */
  private void showTime(TextView msgTime, Message msg, int position) {
    long nowDate = msg.getCreateTime();
    if (mOffset == 18) {
      if (position == 0 || position % 18 == 0) {
        TimeFormat timeFormat = new TimeFormat(context, nowDate);
        msgTime.setText(timeFormat.getDetailTime());
        msgTime.setVisibility(View.VISIBLE);
      } else {
        long lastDate = mMsgList.get(position - 1).getCreateTime();
        // 如果两条消息之间的间隔超过十分钟则显示时间
        if (nowDate - lastDate > 600000) {
          TimeFormat timeFormat = new TimeFormat(context, nowDate);
          msgTime.setText(timeFormat.getDetailTime());
          msgTime.setVisibility(View.VISIBLE);
        } else {
          msgTime.setVisibility(View.GONE);
        }
      }

    } else {
      if (position == 0 || position == mOffset || (position - mOffset) % 18 == 0) {
        TimeFormat timeFormat = new TimeFormat(context, nowDate);
        msgTime.setText(timeFormat.getDetailTime());
        msgTime.setVisibility(View.VISIBLE);
      } else {
        long lastDate = mMsgList.get(position - 1).getCreateTime();
        // 如果两条消息之间的间隔超过十分钟则显示时间
        if (nowDate - lastDate > 600000) {
          TimeFormat timeFormat = new TimeFormat(context, nowDate);
          msgTime.setText(timeFormat.getDetailTime());
          msgTime.setVisibility(View.VISIBLE);
        } else {
          msgTime.setVisibility(View.GONE);
        }
      }
    }
  }
  @Override
  public View getView(final int position, View convertView, ViewGroup parent) {
    final Message msg = mMsgList.get(position);
    final UserInfo userInfo = msg.getFromUser();
    final ViewHolder holder;
    if (convertView == null) {
      holder = new ViewHolder();
      convertView = createViewByType(msg, position);
      switch (msg.getContentType()) {
        case text:
          holder.headIcon = (CircleImageView) convertView.findViewById(R.id.avatar_iv);
          holder.displayName = (TextView) convertView.findViewById(R.id.display_name_tv);
          holder.txtContent = (TextView) convertView.findViewById(R.id.msg_content);
          holder.sendingIv = (ImageView) convertView.findViewById(R.id.sending_iv);
          holder.resend = (ImageButton) convertView.findViewById(R.id.fail_resend_ib);
          holder.groupChange = (TextView) convertView.findViewById(R.id.group_content);
          break;
        case image:
          holder.headIcon = (CircleImageView) convertView.findViewById(R.id.avatar_iv);
          holder.displayName = (TextView) convertView.findViewById(R.id.display_name_tv);
          holder.picture = (ImageView) convertView.findViewById(R.id.picture_iv);
          holder.sendingIv = (ImageView) convertView.findViewById(R.id.sending_iv);
          holder.progressTv = (TextView) convertView.findViewById((R.id.progress_tv));
          holder.resend = (ImageButton) convertView.findViewById(R.id.fail_resend_ib);
          break;
        case voice:
          holder.headIcon = (CircleImageView) convertView.findViewById(R.id.avatar_iv);
          holder.displayName = (TextView) convertView.findViewById(R.id.display_name_tv);
          holder.txtContent = (TextView) convertView.findViewById(R.id.msg_content);
          holder.voice = ((ImageView) convertView.findViewById(R.id.voice_iv));
          holder.sendingIv = (ImageView) convertView.findViewById(R.id.sending_iv);
          holder.voiceLength = (TextView) convertView.findViewById(R.id.voice_length_tv);
          holder.readStatus = (ImageView) convertView.findViewById(R.id.read_status_iv);
          holder.resend = (ImageButton) convertView.findViewById(R.id.fail_resend_ib);
          break;
        case location:
          holder.headIcon = (CircleImageView) convertView.findViewById(R.id.avatar_iv);
          holder.displayName = (TextView) convertView.findViewById(R.id.display_name_tv);
          holder.txtContent = (TextView) convertView.findViewById(R.id.msg_content);
          holder.sendingIv = (ImageView) convertView.findViewById(R.id.sending_iv);
          holder.resend = (ImageButton) convertView.findViewById(R.id.fail_resend_ib);
          break;
        case eventNotification:
          holder.groupChange = (TextView) convertView.findViewById(R.id.group_content);
          break;
        default:
          holder.groupChange = (TextView) convertView.findViewById(R.id.group_content);
      }
      convertView.setTag(holder);
    } else {
      holder = (ViewHolder) convertView.getTag();
    }

    // 显示时间
    TextView msgTime = (TextView) convertView.findViewById(R.id.send_time_txt);
    long nowDate = msg.getCreateTime();
    if (mOffset == 18) {
      if (position == 0 || position % 18 == 0) {
        TimeFormat timeFormat = new TimeFormat(mContext, nowDate);
        msgTime.setText(timeFormat.getDetailTime());
        msgTime.setVisibility(View.VISIBLE);
      } else {
        long lastDate = mMsgList.get(position - 1).getCreateTime();
        // 如果两条消息之间的间隔超过十分钟则显示时间
        if (nowDate - lastDate > 600000) {
          TimeFormat timeFormat = new TimeFormat(mContext, nowDate);
          msgTime.setText(timeFormat.getDetailTime());
          msgTime.setVisibility(View.VISIBLE);
        } else {
          msgTime.setVisibility(View.GONE);
        }
      }
    } else {
      if (position == 0 || position == mOffset || (position - mOffset) % 18 == 0) {
        TimeFormat timeFormat = new TimeFormat(mContext, nowDate);

        msgTime.setText(timeFormat.getDetailTime());
        msgTime.setVisibility(View.VISIBLE);
      } else {
        long lastDate = mMsgList.get(position - 1).getCreateTime();
        // 如果两条消息之间的间隔超过十分钟则显示时间
        if (nowDate - lastDate > 600000) {
          TimeFormat timeFormat = new TimeFormat(mContext, nowDate);
          msgTime.setText(timeFormat.getDetailTime());
          msgTime.setVisibility(View.VISIBLE);
        } else {
          msgTime.setVisibility(View.GONE);
        }
      }
    }

    // 显示头像
    if (holder.headIcon != null) {
      if (userInfo != null && !TextUtils.isEmpty(userInfo.getAvatar())) {
        userInfo.getAvatarBitmap(
            new GetAvatarBitmapCallback() {
              @Override
              public void gotResult(int status, String desc, Bitmap bitmap) {
                if (status == 0) {
                  holder.headIcon.setImageBitmap(bitmap);
                } else {
                  holder.headIcon.setImageResource(R.drawable.jmui_head_icon);
                  HandleResponseCode.onHandle(mContext, status, false);
                }
              }
            });
      } else {
        holder.headIcon.setImageResource(R.drawable.jmui_head_icon);
      }

      // TODO 点击头像事件

    }

    OnLongClickListener longClickListener =
        new OnLongClickListener() {
          @Override
          public boolean onLongClick(View arg0) {
            // 长按文本弹出菜单
            String name = userInfo.getUserName();
            OnClickListener listener =
                new OnClickListener() {

                  @Override
                  public void onClick(View v) {
                    switch (v.getId()) {
                      case R.id.copy_msg_btn:
                        if (msg.getContentType() == ContentType.text) {
                          final String content = ((TextContent) msg.getContent()).getText();
                          if (Build.VERSION.SDK_INT > 11) {
                            ClipboardManager clipboard =
                                (ClipboardManager)
                                    mContext.getSystemService(mContext.CLIPBOARD_SERVICE);
                            ClipData clip = ClipData.newPlainText("Simple text", content);
                            clipboard.setPrimaryClip(clip);
                          } else {
                            ClipboardManager clipboard =
                                (ClipboardManager)
                                    mContext.getSystemService(mContext.CLIPBOARD_SERVICE);
                            clipboard.setText(content); // 设置Clipboard 的内容
                            if (clipboard.hasText()) {
                              clipboard.getText();
                            }
                          }

                          Toast.makeText(
                                  mContext,
                                  mContext.getString(R.string.copy_toast),
                                  Toast.LENGTH_SHORT)
                              .show();
                          mDialog.dismiss();
                        }
                        break;
                      case R.id.forward_msg_btn:
                        mDialog.dismiss();
                        break;
                      case R.id.delete_msg_btn:
                        mConv.deleteMessage(msg.getId());
                        mMsgList.remove(position);
                        notifyDataSetChanged();
                        mDialog.dismiss();
                        break;
                    }
                  }
                };
            boolean hide = msg.getContentType() == ContentType.voice;
            mDialog = DialogCreator.createLongPressMessageDialog(mContext, name, hide, listener);
            mDialog.show();
            mDialog
                .getWindow()
                .setLayout((int) (0.8 * mWidth), WindowManager.LayoutParams.WRAP_CONTENT);
            return true;
          }
        };

    switch (msg.getContentType()) {
      case text:
        handleTextMsg(msg, holder, longClickListener);
        break;
      case image:
        handleImgMsg(msg, holder, position);
        break;
      case voice:
        handleVoiceMsg(msg, holder, position, longClickListener);
        break;
      case eventNotification:
        handleGroupChangeMsg(msg, holder, msgTime);
        break;
      default:
        handleCustomMsg(msg, holder);
    }

    return convertView;
  }