@Override public int getItemViewType(int position) { try { /** 默认是失败类型 */ RenderType type = RenderType.MESSAGE_TYPE_INVALID; Object obj = msgObjectList.get(position); if (obj instanceof Integer) { type = RenderType.MESSAGE_TYPE_TIME_TITLE; } else if (obj instanceof MessageEntity) { MessageEntity info = (MessageEntity) obj; boolean isMine = info.getFromId() == loginUser.getPeerId(); switch (info.getDisplayType()) { case DBConstant.SHOW_AUDIO_TYPE: type = isMine ? RenderType.MESSAGE_TYPE_MINE_AUDIO : RenderType.MESSAGE_TYPE_OTHER_AUDIO; break; case DBConstant.SHOW_IMAGE_TYPE: ImageMessage imageMessage = (ImageMessage) info; if (CommonUtil.gifCheck(imageMessage.getUrl())) { type = isMine ? RenderType.MESSAGE_TYPE_MINE_GIF_IMAGE : RenderType.MESSAGE_TYPE_OTHER_GIF_IMAGE; } else { type = isMine ? RenderType.MESSAGE_TYPE_MINE_IMAGE : RenderType.MESSAGE_TYPE_OTHER_IMAGE; } break; case DBConstant.SHOW_ORIGIN_TEXT_TYPE: if (info.isGIfEmo()) { type = isMine ? RenderType.MESSAGE_TYPE_MINE_GIF : RenderType.MESSAGE_TYPE_OTHER_GIF; } else { type = isMine ? RenderType.MESSAGE_TYPE_MINE_TETX : RenderType.MESSAGE_TYPE_OTHER_TEXT; } break; case DBConstant.SHOW_MIX_TEXT: // logger.e("混合的消息类型%s", obj); default: break; } } return type.ordinal(); } catch (Exception e) { logger.e(e.getMessage()); return RenderType.MESSAGE_TYPE_INVALID.ordinal(); } }
/** * 1.头像事件 mine:事件 other事件 图片的状态 消息收到,没收到,图片展示成功,没有成功 触发图片的事件 【长按】 * * <p>图片消息类型的render * * @param position * @param convertView * @param parent * @param isMine * @return */ private View imageMsgRender( final int position, View convertView, final ViewGroup parent, final boolean isMine) { ImageRenderView imageRenderView; final ImageMessage imageMessage = (ImageMessage) msgObjectList.get(position); UserEntity userEntity = imService.getContactManager().findContact(imageMessage.getFromId()); /** 保存在本地的path */ final String imagePath = imageMessage.getPath(); /** 消息中的image路径 */ final String imageUrl = imageMessage.getUrl(); if (null == convertView) { imageRenderView = ImageRenderView.inflater(ctx, parent, isMine); } else { imageRenderView = (ImageRenderView) convertView; } final ImageView messageImage = imageRenderView.getMessageImage(); final int msgId = imageMessage.getMsgId(); imageRenderView.setBtnImageListener( new ImageRenderView.BtnImageListener() { @Override public void onMsgFailure() { /** * 多端同步也不会拉到本地失败的数据 只有isMine才有的状态,消息发送失败 1. 图片上传失败。点击图片重新上传??[也是重新发送] 2. 图片上传成功,但是发送失败。 * 点击重新发送?? */ if (FileUtil.isSdCardAvailuable()) { // // imageMessage.setLoadStatus(MessageStatus.IMAGE_UNLOAD);//如果是图片已经上传成功呢? imageMessage.setStatus(MessageConstant.MSG_SENDING); if (imService != null) { imService.getMessageManager().resendMessage(imageMessage); } updateItemState(msgId, imageMessage); } else { Toast.makeText(ctx, ctx.getString(R.string.sdcard_unavaluable), Toast.LENGTH_LONG) .show(); } } // DetailPortraitActivity 以前用的是DisplayImageActivity 这个类 @Override public void onMsgSuccess() { Intent i = new Intent(ctx, PreviewMessageImagesActivity.class); Bundle bundle = new Bundle(); bundle.putSerializable(IntentConstant.CUR_MESSAGE, imageMessage); i.putExtras(bundle); ctx.startActivity(i); ((Activity) ctx).overridePendingTransition(R.anim.tt_image_enter, R.anim.tt_stay); } }); // 设定触发loadImage的事件 imageRenderView.setImageLoadListener( new ImageRenderView.ImageLoadListener() { @Override public void onLoadComplete(String loaclPath) { logger.d("chat#pic#save image ok"); logger.d("pic#setsavepath:%s", loaclPath); // imageMessage.setPath(loaclPath);//下载的本地路径不再存储 imageMessage.setLoadStatus(MessageConstant.IMAGE_LOADED_SUCCESS); updateItemState(imageMessage); } @Override public void onLoadFailed() { logger.d("chat#pic#onBitmapFailed"); imageMessage.setLoadStatus(MessageConstant.IMAGE_LOADED_FAILURE); updateItemState(imageMessage); logger.d("download failed"); } }); final View messageLayout = imageRenderView.getMessageLayout(); messageImage.setOnLongClickListener( new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { // 创建一个pop对象,然后 分支判断状态,然后显示需要的内容 MessageOperatePopup popup = getPopMenu(parent, new OperateItemClickListener(imageMessage, position)); boolean bResend = (imageMessage.getStatus() == MessageConstant.MSG_FAILURE) || (imageMessage.getLoadStatus() == MessageConstant.IMAGE_UNLOAD); popup.show(messageLayout, DBConstant.SHOW_IMAGE_TYPE, bResend, isMine); return true; } }); /** 父类控件中的发送失败view */ imageRenderView .getMessageFailed() .setOnClickListener( new View.OnClickListener() { @Override public void onClick(View arg0) { // 重发或者重新加载 MessageOperatePopup popup = getPopMenu(parent, new OperateItemClickListener(imageMessage, position)); popup.show(messageLayout, DBConstant.SHOW_IMAGE_TYPE, true, isMine); } }); imageRenderView.render(imageMessage, userEntity, ctx); return imageRenderView; }