Files
yusheng-android/moduleroom/src/main/java/com/example/moduleroom/adapter/EaseChatAdapter.java

489 lines
24 KiB
Java
Raw Normal View History

2025-10-20 10:16:44 +08:00
package com.example.moduleroom.adapter;
import android.app.Activity;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import androidx.annotation.NonNull;
import com.bumptech.glide.Glide;
import com.chad.library.adapter.base.BaseMultiItemQuickAdapter;
import com.chad.library.adapter.base.BaseViewHolder;
import com.example.moduleroom.R;
import com.xscm.moduleutil.bean.RoomMessageEvent;
import com.xscm.moduleutil.bean.room.EMMessageInfo;
import com.xscm.moduleutil.utils.ColorManager;
import com.xscm.moduleutil.utils.ImageUtils;
import com.xscm.moduleutil.utils.logger.Logger;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
/**
* @author xf
*/
public class EaseChatAdapter extends BaseMultiItemQuickAdapter<EMMessageInfo, BaseViewHolder> {
// private int[] a = {R.drawable.random0s, R.drawable.random1s, R.drawable.random2s, R.drawable.random3s, R.drawable.random4s, R.drawable.random5s, R.drawable.random6s, R.drawable.random7s, R.drawable.random8s, R.drawable.random9s};
private int listShowType = 1;
public static int SHOW_TYPE_ALL = 1;
public static int SHOW_TYPE_USER = 2;
public static int SHOW_TYPE_SYSTEM = 3;
private List<EMMessageInfo> allMsgList;
private List<EMMessageInfo> userMsgList;
private List<EMMessageInfo> systemMsgList;
public EaseChatAdapter() {
super(null);
addItemType(1, com.xscm.moduleutil.R.layout.ease_row_received_message_system);//系统消息、官方公告
addItemType(2, com.xscm.moduleutil.R.layout.ease_row_received_message_user_send);//用户发送的消息
addItemType(3, com.xscm.moduleutil.R.layout.ease_row_received_message_user_send);//加入房间 、赠送礼物、上下麦、禁言 2025年6月12日15:42:08让和聊天显示的是同一个额布局后面需要修改
// addItemType(3, com.qxcm.moduleutil.R.layout.ease_row_received_message_join_room);//加入房间 、赠送礼物、上下麦、禁言
addItemType(4, com.xscm.moduleutil.R.layout.ease_row_received_message_new_user);//新用户注册
addItemType(5, com.xscm.moduleutil.R.layout.ease_row_received_message_wagging);//摇签
addItemType(6, com.xscm.moduleutil.R.layout.ease_row_received_message_expression);//表情
// addItemType(8, com.qxcm.moduleutil.R.layout.ease_row_received_message_game);//球球大作战
// addItemType(9, com.qxcm.moduleutil.R.layout.ease_row_received_message_demand);//派单需求
// addItemType(10, com.qxcm.moduleutil.R.layout.ease_row_received_message_red_rain);//红包雨消息
// addItemType(11, com.qxcm.moduleutil.R.layout.ease_row_received_message_red_rain);//红包雨消息结束
allMsgList = new ArrayList<>();
userMsgList = new ArrayList<>();
systemMsgList = new ArrayList<>();
}
public void setShowType(int type) {
if (type == listShowType) {
return;
}
listShowType = type;
List currData = new ArrayList();
if (type == SHOW_TYPE_ALL) {
currData.addAll(allMsgList);
// if (allMsgList.size() > 20) {
// // 只添加最近的20条消息
// int startIndex = Math.max(0, allMsgList.size() - 20);
// currData.addAll(allMsgList.subList(startIndex, allMsgList.size()));
// }else {
// currData.addAll(allMsgList);
// }
} else if (type == SHOW_TYPE_USER) {
currData.addAll(userMsgList);
} else if (type == SHOW_TYPE_SYSTEM) {
currData.addAll(systemMsgList);
}
setNewData(currData);
//notifyDataSetChanged();
}
@Override
protected void convert(BaseViewHolder helper, EMMessageInfo item) {
RoomMessageEvent emMessage = item.getEmMessage();
// EMTextMessageBody txtBody = (EMTextMessageBody) emMessage.getBody();
// Spanned spanned = Html.fromHtml(txtBody.getMessage());
// String message = txtBody.getMessage();
// Log.e("环信消息", message);
// SpanUtils spanUtils = new SpanUtils();
// String role = emMessage.getStringAttribute("role", "0");
// String userIsNew = emMessage.getStringAttribute("user_is_new", "0");
// String rankIcon = emMessage.getStringAttribute("rank_icon", "");
// String nobilityIcon = emMessage.getStringAttribute("nobility_icon", "");
// String nickname = emMessage.getStringAttribute("nickname", "");
// String type = emMessage.getStringAttribute("type", "");
// String charmIcon = emMessage.getStringAttribute("charm_icon", null);
// String user_title = emMessage.getStringAttribute("user_title", null);
// String emoji_special = emMessage.getStringAttribute("face_special", message);
// String userId = emMessage.getStringAttribute("user_id", null);
// Spanned spanned1 = null;
//
TextView tv_content= helper.getView(R.id.tv_content);
switch (helper.getItemViewType()) {
case 1:
helper.getView(R.id.tv_content).setVisibility(View.VISIBLE);
helper.setText(R.id.tv_content, emMessage.getText().getText());
tv_content.setTextColor(ColorManager.getInstance().getPrimaryColorInt());
break;
case 2:
ImageUtils.loadHeadCC(emMessage.getText().getFromUserInfo().getAvatar(), helper.getView(com.xscm.moduleutil.R.id.avatar));
helper.setText(com.xscm.moduleutil.R.id.tv_name, emMessage.getText().getFromUserInfo().getNickname());
helper.setText(com.xscm.moduleutil.R.id.tv_content, emMessage.getText().getText());
List<String> images = emMessage.getText().getFromUserInfo().getIcon();
LinearLayout ll_images = helper.getView(com.xscm.moduleutil.R.id.line);
ll_images.removeAllViews();
for (String url : images) {
if (url.contains("http")) {
ImageView imageView = new ImageView(helper.itemView.getContext());
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
helper.itemView.getContext().getResources().getDimensionPixelSize(com.xscm.moduleutil.R.dimen.dp_37),
helper.itemView.getContext().getResources().getDimensionPixelSize(com.xscm.moduleutil.R.dimen.dp_14)
);
params.setMargins(0, 0, helper.itemView.getContext().getResources().getDimensionPixelSize(com.xscm.moduleutil.R.dimen.dp_5), 0); // 右边距
imageView.setLayoutParams(params);
imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
// 使用 Glide 加载图片
ImageUtils.loadHeadCC(url, imageView);
ll_images.addView(imageView);
}
}
tv_content.setTextColor(ColorManager.getInstance().getPrimaryColorInt());
break;
case 3:
// int paddingLeftValues3 = 0;//距离左边距(默认加上8dp间距)
// ivRole = helper.getView(R.id.iv_role);
// ivNew = helper.getView(R.id.iv_new);
// ivGrade = helper.getView(R.id.iv_grade);
// ivTitle = helper.getView(R.id.iv_title_label);
// ivNHobility = helper.getView(R.id.iv_nobility);
// TextView tvContent3 = helper.getView(R.id.tv_content);
// ivRole.setRole(Integer.parseInt(role));
// ivNew.setNew(Integer.parseInt(userIsNew));
// ivGrade.setGrade(rankIcon);
// ivTitle.setLabelView(user_title);
// ivTitle.setLabelView(user_title);
// ivNHobility.setNobility(nobilityIcon);
// ImageUtils.loadIcon(charmIcon, helper.getView(R.id.iv_charm));
// // ---------------------------- 获取 最终的padding值
// //爵位图标判断
// if (ivNHobility.getVisibility() == View.VISIBLE) {
// paddingLeftValues3 += 23;
// }
// //角色图标
// if (ivRole.getVisibility() == View.VISIBLE) {
// paddingLeftValues3 += 27;
// }
// //新人图标
// if (ivNew.getVisibility() == View.VISIBLE) {
// paddingLeftValues3 += 33;
// }
// //等级图标
// if (ivGrade.getVisibility() == View.VISIBLE) {
// paddingLeftValues3 += 33;
// }
//
// //称号图标
// try {
// if (user_title == null || user_title.isEmpty()){
// user_title = "";
// }
// String s = user_title.substring(user_title.lastIndexOf("=") + 1);
// if (TextUtils.isEmpty(s)){
// s = "1";
// }
// int mWidth = (int) (Float.parseFloat(s) * 20);
// int mHeight = 20;
// ViewGroup.LayoutParams layoutParams = ivTitle.getLayoutParams();
// layoutParams.width = ConvertUtils.dp2px(mWidth);
// layoutParams.height = ConvertUtils.dp2px(mHeight);
// ivTitle.setLayoutParams(layoutParams);
// if (ivTitle.getVisibility() == View.VISIBLE) {
// paddingLeftValues3 += (mWidth + 3);
// }
// } catch (Exception e) {
// e.printStackTrace();
// }
// //魅力图标
// if (helper.getView(R.id.iv_charm).getVisibility() == View.VISIBLE) {
// paddingLeftValues3 += 23;
// }
// spanUtils.append(nickname + " ").setForegroundColor(mContext.getResources().getColor(R.color.color_FFFFBC00)).setFontSize(ResourceUtil.getDimen(R.dimen.sp_13))
// .append(spanned);
// tvContent3.setPadding(ResourceUtil.getDimen(String.valueOf(paddingLeftValues3)), 0, 0, 0);
// tvContent3.setText(spanUtils.create());
ImageUtils.loadHeadCC(emMessage.getText().getFromUserInfo().getAvatar(), helper.getView(com.xscm.moduleutil.R.id.avatar));
helper.setText(com.xscm.moduleutil.R.id.tv_name, emMessage.getText().getFromUserInfo().getNickname());
helper.setText(com.xscm.moduleutil.R.id.tv_content, emMessage.getText().getText());
List<String> images1 = emMessage.getText().getFromUserInfo().getIcon();
LinearLayout ll_images1 = helper.getView(com.xscm.moduleutil.R.id.line);
ll_images1.removeAllViews();
for (String url : images1) {
if (url.contains("http")) {
ImageView imageView = new ImageView(helper.itemView.getContext());
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
helper.itemView.getContext().getResources().getDimensionPixelSize(com.xscm.moduleutil.R.dimen.dp_37),
helper.itemView.getContext().getResources().getDimensionPixelSize(com.xscm.moduleutil.R.dimen.dp_14)
);
params.setMargins(0, 0, helper.itemView.getContext().getResources().getDimensionPixelSize(com.xscm.moduleutil.R.dimen.dp_5), 0); // 右边距
imageView.setLayoutParams(params);
imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
// 使用 Glide 加载图片
ImageUtils.loadHeadCC(url, imageView);
ll_images1.addView(imageView);
}
}
tv_content.setTextColor(ColorManager.getInstance().getPrimaryColorInt());
break;
// case 4:
// TextView tvContent7 = helper.getView(R.id.tv_content);
// ivNew = helper.getView(R.id.new_view);
// ivNew.setNew(1);
// tvContent7.setText(new SpanUtils().append(spanned).create());
// break;
// //抽签
// case 5:
// String number = emMessage.getStringAttribute("number", "");
// ivRole = helper.getView(R.id.iv_role);
// ivNew = helper.getView(R.id.iv_new);
// ivGrade = helper.getView(R.id.iv_grade);
// ivTitle = helper.getView(R.id.iv_title_label);
// ivNHobility = helper.getView(R.id.iv_nobility);
// tvName = helper.getView(R.id.tv_name);
// TextView tvContent5 = helper.getView(R.id.tv_content);
// ivRole.setRole(Integer.parseInt(role));
// ivNew.setNew(Integer.parseInt(userIsNew));
// ivGrade.setGrade(rankIcon);
// //称号图标
// try {
// String s = user_title.substring(user_title.lastIndexOf("=") + 1);
// int mWidth = (int) (Float.parseFloat(s) * 20);
// int mHeight = 20;
// ViewGroup.LayoutParams layoutParams = ivTitle.getLayoutParams();
// layoutParams.width = ConvertUtils.dp2px(mWidth);
// layoutParams.height = ConvertUtils.dp2px(mHeight);
// ivTitle.setLayoutParams(layoutParams);
// } catch (Exception e) {
// e.printStackTrace();
// }
// ivTitle.setLabelView(user_title);
// ivNHobility.setNobility(nobilityIcon);
// ImageUtils.loadIcon(charmIcon, helper.getView(R.id.iv_charm));
// tvName.setText(String.format("%s:", nickname));
// tvContent5.setText(new SpanUtils().append(spanned).create());
// GlideApp.with(mContext).load(String.format("http://soundriver.oss-cn-hangzhou.aliyuncs.com/custom/random%ss.webp", number)).into(new SimpleTarget<Drawable>() {
// @Override
// public void onResourceReady(@NonNull Drawable drawable, @Nullable Transition<? super Drawable> transition) {
// if (drawable instanceof WebpDrawable) {
// AppCompatImageView imageView = helper.getView(R.id.iv_wagginh);
// imageView.setImageDrawable(drawable);
// ((WebpDrawable) drawable).start();
// ((WebpDrawable) drawable).setLoopCount(1);
// ((WebpDrawable) drawable).registerAnimationCallback(new Animatable2Compat.AnimationCallback() {
// @Override
// public void onAnimationEnd(Drawable drawable) {
// super.onAnimationEnd(drawable);
// helper.setImageResource(R.id.iv_wagginh, a[Integer.parseInt(number)]);
// }
// });
// }
// }
// });
// break;
// //表情
// case 6:
// ivRole = helper.getView(R.id.iv_role);
// ivNew = helper.getView(R.id.iv_new);
// ivGrade = helper.getView(R.id.iv_grade);
// ivTitle = helper.getView(R.id.iv_title_label);
// ivNHobility = helper.getView(R.id.iv_nobility);
// tvName = helper.getView(R.id.tv_name);
// ivRole.setRole(Integer.parseInt(role));
// ivNew.setNew(Integer.parseInt(userIsNew));
// ivGrade.setGrade(rankIcon);
// ivTitle.setLabelView(user_title);
// ivNHobility.setNobility(nobilityIcon);
// tvName.setText(Html.fromHtml(nickname));
// ImageUtils.loadIcon(charmIcon, helper.getView(R.id.iv_charm));
// ImageLoader.loadIcon(mContext, helper.getView(R.id.iv_expression), emoji_special);
//
// //称号图标
// try {
// String s = user_title.substring(user_title.lastIndexOf("=") + 1);
// int mWidth = (int) (Float.parseFloat(s) * 20);
// int mHeight = 20;
// ViewGroup.LayoutParams layoutParams = ivTitle.getLayoutParams();
// layoutParams.width = ConvertUtils.dp2px(mWidth);
// layoutParams.height = ConvertUtils.dp2px(mHeight);
// ivTitle.setLayoutParams(layoutParams);
// } catch (Exception e) {
// e.printStackTrace();
// }
// break;
// //球球大作战
// case 8:
// String first = emMessage.getStringAttribute("first", "");
// String second = emMessage.getStringAttribute("second", "");
// String third = emMessage.getStringAttribute("third", "");
//
// ivRole = helper.getView(R.id.iv_role);
// ivNew = helper.getView(R.id.iv_new);
// ivGrade = helper.getView(R.id.iv_grade);
// ivTitle = helper.getView(R.id.iv_title_label);
// ivNHobility = helper.getView(R.id.iv_nobility);
// tvName = helper.getView(R.id.tv_name);
// TextView tvContent8 = helper.getView(R.id.tv_content);
//
// ivRole.setRole(Integer.parseInt(role));
// ivNew.setNew(Integer.parseInt(userIsNew));
// ivGrade.setGrade(rankIcon);
// ivTitle.setLabelView(user_title);
// ivNHobility.setNobility(nobilityIcon);
// ImageUtils.loadIcon(charmIcon, helper.getView(R.id.iv_charm));
// tvName.setText(Html.fromHtml(nickname));
// if (emMessage.getIntAttribute("type", 0) == 6019) {//亮球
// helper.setVisible(R.id.iv_qiu1, true);
// helper.setVisible(R.id.iv_qiu2, true);
// helper.setVisible(R.id.iv_qiu3, true);
//
// try {
// helper.setImageResource(R.id.iv_qiu1, mContext.getResources().getIdentifier(first, "mipmap", mContext.getPackageName()));
// helper.setImageResource(R.id.iv_qiu2, mContext.getResources().getIdentifier(second, "mipmap", mContext.getPackageName()));
// helper.setImageResource(R.id.iv_qiu3, mContext.getResources().getIdentifier(third, "mipmap", mContext.getPackageName()));
// } catch (Exception e) {
// e.printStackTrace();
// }
//
// } else {
// helper.setVisible(R.id.iv_qiu1, false);
// helper.setVisible(R.id.iv_qiu2, false);
// helper.setVisible(R.id.iv_qiu3, false);
// }
// spanUtils.append(spanned);
// tvContent8.setText(spanUtils.create());
// break;
// case 10:
// TextView tv = helper.getView(R.id.tv_content);
// float height = tv.getTextSize();//获取字体高度
// String bell = "<img src=\"" + R.drawable.ease_message_bell + "\"/>"; //前面加一个铃铛
// Spanned sp = Html.fromHtml(bell + txtBody.getMessage(), source -> {
// Drawable drawable;
// drawable = mContext.getResources().getDrawable(Integer.parseInt(source));
// drawable.setBounds(0, 0, (int) (height * 36f / 42f), (int) height); //等比例设置铃铛大小
// return drawable;
// }, null);
// tv.setText(sp);
// helper.setGone(R.id.tv_red_rain_detail, false);
// break;
// case 11:
// TextView tv11 = helper.getView(R.id.tv_content);
// float height11 = tv11.getTextSize();//获取字体高度
// String bell11 = "<img src=\"" + R.drawable.ease_message_bell + "\"/>"; //前面加一个铃铛
// Spanned sp11 = Html.fromHtml(bell11 + txtBody.getMessage(), source -> {
// Drawable drawable;
// drawable = mContext.getResources().getDrawable(Integer.parseInt(source));
// drawable.setBounds(0, 0, (int) (height11 * 36f / 42f), (int) height11); //等比例设置铃铛大小
// return drawable;
// }, null);
// tv11.setText(sp11);
// helper.setGone(R.id.tv_red_rain_detail, true);
// helper.addOnClickListener(R.id.tv_red_rain_detail);
// break;
// default:
// helper.setText(R.id.tv_content, Html.fromHtml(txtBody.getMessage()));
// break;
}
}
@Override
public void onViewRecycled(@NonNull BaseViewHolder holder) {
Logger.e("onViewRecycled", "onViewRecycled");
ImageView ivEmoji = holder.getView(com.xscm.moduleutil.R.id.iv_expression);
// ImageView ivGrade = holder.getView(com.qxcm.moduleutil.R.id.iv_grade);
ImageView ivNobility = holder.getView(com.xscm.moduleutil.R.id.iv_nobility);
ImageView ivCharm = holder.getView(com.xscm.moduleutil.R.id.iv_charm);
// ImageView ivTitle = holder.getView(com.qxcm.moduleutil.R.id.iv_title_label);
if (mContext instanceof Activity && (((Activity) mContext).isFinishing() || ((Activity) mContext).isDestroyed())) {
return;
}
try {
if (ivEmoji != null) {
ivEmoji.setImageDrawable(null);
Glide.with(ivEmoji.getContext()).clear(ivEmoji);
}
// if (ivGrade != null) {
// ivGrade.setImageDrawable(null);
// Glide.with(ivGrade.getContext()).clear(ivGrade);
// }
if (ivNobility != null) {
ivNobility.setImageDrawable(null);
Glide.with(ivNobility.getContext()).clear(ivNobility);
}
if (ivCharm != null) {
ivCharm.setImageDrawable(null);
Glide.with(ivCharm.getContext()).clear(ivCharm);
}
// if (ivTitle != null) {
// ivTitle.setImageDrawable(null);
// Glide.with(ivTitle.getContext()).clear(ivTitle);
// }
} catch (Exception e) {
e.printStackTrace();
}
super.onViewRecycled(holder);
}
/**
* 清除数据
*
* @param
*/
public void clearData() {
this.mData.clear();
userMsgList.clear();
systemMsgList.clear();
allMsgList.clear();
notifyDataSetChanged();
}
public void clearSomeData() {
if (this.mData != null && mData.size() > 500) {
List<EMMessageInfo> emMessageInfos = mData.subList(500, mData.size());
setNewData(emMessageInfos);
}
if (allMsgList.size() > 500) {
allMsgList = allMsgList.subList(500, allMsgList.size());
}
if (userMsgList.size() > 500) {
userMsgList = userMsgList.subList(500, userMsgList.size());
}
if (systemMsgList.size() > 500) {
systemMsgList = systemMsgList.subList(500, systemMsgList.size());
}
}
@Override
public void addData(@NonNull EMMessageInfo data) {
// super.addData(data);
allMsgList.add(data);
if (data.getItemType() == 2) {
userMsgList.add(data);
} else if (data.getItemType() == 3) {
systemMsgList.add(data);
}
if (listShowType == SHOW_TYPE_ALL
|| ((data.getItemType() == 2) && listShowType == SHOW_TYPE_USER)
|| ((data.getItemType() == 3) && listShowType == SHOW_TYPE_SYSTEM)
) {
super.addData(data);
}
}
@Override
public void addData(@NonNull Collection<? extends EMMessageInfo> newData) {
// super.addData(newData);
if (newData == null || newData.size() == 0) {
return;
}
List<EMMessageInfo> list = new ArrayList<>();
list.addAll(newData);
for (int i = 0; i < list.size(); i++) {
addData(list.get(i));
}
}
}