Files
yusheng-android/MainModule/src/main/java/com/xscm/modulemain/adapter/EaseChatAdapter.java

737 lines
37 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package com.xscm.modulemain.adapter;
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.os.Handler;
import android.text.Spannable;
import android.text.SpannableStringBuilder;
import android.text.TextUtils;
import android.text.style.ForegroundColorSpan;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.constraintlayout.widget.ConstraintLayout;
import com.bumptech.glide.Glide;
import com.bumptech.glide.load.DataSource;
import com.bumptech.glide.load.engine.GlideException;
import com.bumptech.glide.request.RequestListener;
import com.bumptech.glide.request.target.SimpleTarget;
import com.bumptech.glide.request.target.Target;
import com.bumptech.glide.request.transition.Transition;
import com.chad.library.adapter.base.BaseMultiItemQuickAdapter;
import com.chad.library.adapter.base.BaseViewHolder;
import com.xscm.modulemain.R;
import com.xscm.modulemain.FakeNinePatchDrawable;
import com.xscm.moduleutil.bean.GiftBean;
import com.xscm.moduleutil.bean.RoomMessageEvent;
import com.xscm.moduleutil.bean.UserInfo;
import com.xscm.moduleutil.bean.room.EMMessageInfo;
import com.xscm.moduleutil.bean.room.EmotionDeatils;
import com.xscm.moduleutil.utils.ImageUtils;
import com.xscm.moduleutil.utils.MeHeadView;
import com.xscm.moduleutil.utils.logger.Logger;
import com.xscm.moduleutil.widget.AdaptiveImageView;
import com.xscm.moduleutil.widget.GifAvatarOvalView;
import com.xscm.moduleutil.widget.img.BubbleBackgroundHelper;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
/**
* @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;
private String messageNameColor = "#00C8FF";//名称的颜色
private String messageGiftColor = "#FFE309";//礼物的颜色
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_system);//加入房间 、赠送礼物、上下麦、禁言 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 (type == SHOW_TYPE_USER) {
currData.addAll(userMsgList);
}
if (type == SHOW_TYPE_SYSTEM) {
currData.addAll(systemMsgList);
}
setNewData(currData);
//notifyDataSetChanged();
}
private SpannableStringBuilder getSpannable(RoomMessageEvent message) {
// 在 Android 中实现类似的富文本功能
SpannableStringBuilder spannable = new SpannableStringBuilder(message.getText().getText() != null ? message.getText().getText() : "");
// 设置发送者昵称的颜色
if (message.getText().getFromUserInfo() != null && !TextUtils.isEmpty(message.getText().getFromUserInfo().getNickname())) {
String nickname = message.getText().getFromUserInfo().getNickname();
int startIndex = message.getText().getText().indexOf(nickname);
if (startIndex != -1) {
int endIndex = startIndex + nickname.length();
spannable.setSpan(new ForegroundColorSpan(Color.parseColor(messageNameColor)), startIndex, endIndex, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
}
// 设置接收者昵称的颜色
if (message.getText().getToUserInfo() != null && !TextUtils.isEmpty(message.getText().getToUserInfo().getNickname())) {
String nickname = message.getText().getToUserInfo().getNickname();
int startIndex = message.getText().getText().indexOf(nickname);
if (startIndex != -1) {
int endIndex = startIndex + nickname.length();
spannable.setSpan(new ForegroundColorSpan(Color.parseColor(messageNameColor)), startIndex, endIndex, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
}
// 处理礼物名称的颜色设置
if (message.getText().getGiftInfo() != null && !TextUtils.isEmpty(message.getText().getGiftInfo().getGift_name())) {
String[] giftNames = message.getText().getGiftInfo().getGift_name().split(",");
for (String giftName : giftNames) {
List<int[]> occurrences = findAllOccurrencesOfString(message.getText().getText(), giftName);
for (int[] range : occurrences) {
spannable.setSpan(new ForegroundColorSpan(Color.parseColor(messageGiftColor)), range[0], range[1], Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
}
}
// 处理多个礼物信息的颜色设置
if (message.getText().getGiftInfos() != null && !message.getText().getGiftInfos().isEmpty()) {
for (GiftBean gift : message.getText().getGiftInfos()) {
if (!TextUtils.isEmpty(gift.getGift_name())) {
int startIndex = message.getText().getText().indexOf(gift.getGift_name());
if (startIndex != -1) {
int endIndex = startIndex + gift.getGift_name().length();
spannable.setSpan(new ForegroundColorSpan(Color.parseColor(messageGiftColor)), startIndex, endIndex, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
}
}
}
// 处理多个接收者信息的颜色设置
if (message.getText().getToUserInfos() != null && !message.getText().getToUserInfos().isEmpty()) {
for (int i = 0; i < message.getText().getToUserInfos().size(); i++) {
UserInfo userModel = message.getText().getToUserInfos().get(i);
if (!TextUtils.isEmpty(userModel.getNickname())) {
List<int[]> occurrences = findAllOccurrencesOfString(message.getText().getText(), userModel.getNickname());
for (int[] range : occurrences) {
spannable.setSpan(new ForegroundColorSpan(Color.parseColor(messageNameColor)), range[0], range[1], Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
}
}
}
return spannable;
}
/**
* 查找字符串中所有子字符串出现的位置
*
* @param text 原始文本
* @param searchString 要查找的子字符串
* @return 包含所有出现位置的列表,每个位置用 [start, end] 表示
*/
private List<int[]> findAllOccurrencesOfString(String text, String searchString) {
List<int[]> occurrences = new ArrayList<>();
if (TextUtils.isEmpty(text) || TextUtils.isEmpty(searchString)) {
return occurrences;
}
int index = text.indexOf(searchString);
while (index >= 0) {
occurrences.add(new int[]{index, index + searchString.length()});
index = text.indexOf(searchString, index + searchString.length());
}
return occurrences;
}
@Override
protected void convert(BaseViewHolder helper, EMMessageInfo item) {
RoomMessageEvent emMessage = item.getEmMessage();
// 重置 ImageView 状态,防止复用导致的图片错乱
switch (helper.getItemViewType()) {
case 1:
helper.getView(R.id.tv_content).setVisibility(View.VISIBLE);
helper.setText(R.id.tv_content, getSpannable(emMessage));
// helper.setText(R.id.tv_content, emMessage.getText().getText());
// tv_content.setTextColor(ColorManager.getInstance().getPrimaryColorInt());
break;
case 2:
AdaptiveImageView emojiImageView = helper.getView(com.xscm.moduleutil.R.id.im_emj);
emojiImageView.setTag("");
Glide.with(mContext).clear(emojiImageView);
emojiImageView.setVisibility(View.VISIBLE);
helper.getView(com.xscm.moduleutil.R.id.tv_content).setVisibility(View.GONE);
MeHeadView avatar = helper.getView(com.xscm.moduleutil.R.id.avatar);
avatar.setData(emMessage.getText().getFromUserInfo().getAvatar(), "", emMessage.getText().getFromUserInfo().getNobility_image());
// 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.setTextColor(com.xscm.moduleutil.R.id.tv_name, emMessage.getText().getFromUserInfo().getNickname_color() != null && !emMessage.getText().getFromUserInfo().getNickname_color().isEmpty() ? Color.parseColor(emMessage.getText().getFromUserInfo().getNickname_color()) : Color.parseColor("#CCA882"));
if (emMessage.getText().getText() != null) {
helper.setText(com.xscm.moduleutil.R.id.tv_content, getSpannable(emMessage));
}
// 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_57),
helper.itemView.getContext().getResources().getDimensionPixelSize(com.xscm.moduleutil.R.dimen.dp_15)
);
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);
}
}
if (emMessage.getText().getFromUserInfo().getChat_bubble() != null && !emMessage.getText().getFromUserInfo().getChat_bubble().isEmpty()) {
// 使用 Glide 加载图片并设置名称
String imageUrl = emMessage.getText().getFromUserInfo().getChat_bubble();
Glide.with(mContext)
.load(imageUrl)
.into(new SimpleTarget<Drawable>() {
@Override
public void onResourceReady(@NonNull Drawable resource, @Nullable Transition<? super Drawable> transition) {
// 将资源转换为 Bitmap
if (resource instanceof BitmapDrawable) {
Bitmap bitmap = ((BitmapDrawable) resource).getBitmap();
// 创建新的文件名
Drawable fakeNinePatch = new FakeNinePatchDrawable(bitmap, 0.4f, 0.4f, 0.6f, 0.5f);
// 保存图片到本地
helper.getView(com.xscm.moduleutil.R.id.bubble).setBackground(fakeNinePatch);
}
}
@Override
public void onLoadFailed(@Nullable Drawable errorDrawable) {
// 加载失败处理
}
});
} else {
helper.getView(com.xscm.moduleutil.R.id.bubble).setBackgroundResource(com.xscm.moduleutil.R.drawable.ease_row_pubilc_user_bg);
}
if (emMessage.getText().getEmoji() != null && emMessage.getText().getEmoji().getAnimate_image() != null) {
// 为每个加载任务设置唯一标识
String uniqueId = emMessage.getRoomId() + "_" + helper.getLayoutPosition();
emojiImageView.setTag(uniqueId);
//这段代码使用 Optional 链式调用安全地获取 emMessage 中的 animate_image 字段,避免空指针异常。如果任意环节为 null则返回空字符串。
String animateImage = Optional.ofNullable(emMessage)
.map(RoomMessageEvent::getText)
.map(RoomMessageEvent.T::getEmoji)
.map(EmotionDeatils::getAnimate_image)
.orElse("");
// if (Objects.equals(emMessage.getText().getEmoji().getAnimate_image(), "") ||
// emMessage.getText().getEmoji().getAnimate_image().isEmpty()) {
if (!animateImage.isEmpty()) {
// 检查视图是否仍属于当前数据项
if (uniqueId.equals(emojiImageView.getTag())) {
ImageUtils.loadHeadCC(emMessage.getText().getEmoji().getImage(), emojiImageView);
}
return;
}
if (!emMessage.getText().getEmoji().getAnimate_image().isEmpty()) {
// 使用 RequestListener 监听加载完成
Glide.with(mContext)
.load(emMessage.getText().getEmoji().getAnimate_image())
.listener(new RequestListener<Drawable>() {
@Override
public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target,
DataSource dataSource, boolean isFirstResource) {
// 检查视图是否仍属于当前数据项
if (uniqueId.equals(emojiImageView.getTag())) {
// 加载完成后执行
new Handler().postDelayed(() -> {
// 再次检查视图状态
if (uniqueId.equals(emojiImageView.getTag())) {
Glide.with(mContext)
.load(emMessage.getText().getEmoji().getImage())
.into(emojiImageView);
}
}, 1500);
}
return false;
}
@Override
public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target,
boolean isFirstResource) {
return false;
}
})
.into(emojiImageView);
} else {
Glide.with(mContext)
.load(emMessage.getText().getEmoji().getImage())
.into(emojiImageView);
}
} else {
helper.getView(com.xscm.moduleutil.R.id.tv_content).setVisibility(View.VISIBLE);
emojiImageView.setVisibility(View.GONE);
}
break;
case 3:
// if (emMessage.getText().getFromUserInfo().getChat_bubble() != null && !emMessage.getText().getFromUserInfo().getChat_bubble().isEmpty()) {
//// helper.getView(com.xscm.moduleutil.R.id.bubble).setBackgroundResource(com.xscm.moduleutil.R.mipmap.qipaokang);
//// ImageUtils.loadHeadCC(emMessage.getText().getFromUserInfo().getChat_bubble(), helper.getView(com.xscm.moduleutil.R.id.network_background));
//
// // 使用 Glide 加载图片并设置名称
// String imageUrl = emMessage.getText().getFromUserInfo().getChat_bubble();
//
// Glide.with(mContext)
// .load(imageUrl)
// .into(new SimpleTarget<Drawable>() {
// @Override
// public void onResourceReady(@NonNull Drawable resource, @Nullable Transition<? super Drawable> transition) {
// // 将资源转换为 Bitmap
// if (resource instanceof BitmapDrawable) {
// Bitmap bitmap = ((BitmapDrawable) resource).getBitmap();
// // 创建新的文件名
// Drawable fakeNinePatch = new FakeNinePatchDrawable(bitmap, 0.4f, 0.4f, 0.6f, 0.5f);
//
// // 保存图片到本地
// helper.getView(com.xscm.moduleutil.R.id.bubble).setBackground(fakeNinePatch);
// }
// }
//
// @Override
// public void onLoadFailed(@Nullable Drawable errorDrawable) {
// // 加载失败处理
// }
// });
// } else {
// helper.getView(com.xscm.moduleutil.R.id.bubble1).setBackgroundResource(com.xscm.moduleutil.R.drawable.ease_row_pubilc_user_bg);
// }
// if (emMessage.getText().getFromUserInfo() != null && emMessage.getText().getFromUserInfo().getAvatar() != null) {
// 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());
helper.getView(R.id.tv_content).setVisibility(View.VISIBLE);
helper.setText(R.id.tv_content, getSpannable(emMessage));
// List<String> images1 = emMessage.getText().getFromUserInfo().getIcon();
// LinearLayout ll_images1 = helper.getView(com.xscm.moduleutil.R.id.line);
// ll_images1.removeAllViews();
// if (images1 == null) {
// return;
// }
// 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_57),
// helper.itemView.getContext().getResources().getDimensionPixelSize(com.xscm.moduleutil.R.dimen.dp_15)
// );
// 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);
// }
// }
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;
}
}
private void loadBubbleBackground(Context context, String bubbleUrl, ConstraintLayout messageTextView) {
// String bubbleUrl = "https://midi01.oss-cn-beijing.aliyuncs.com/iosaixinqipao_17610381079117.png";
BubbleBackgroundHelper.loadBubbleBackground(context, bubbleUrl,
new BubbleBackgroundHelper.OnBubbleBackgroundLoadedListener() {
@Override
public void onBackgroundLoaded(Drawable bubbleDrawable) {
// 设置背景
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
messageTextView.setBackground(bubbleDrawable);
} else {
messageTextView.setBackgroundDrawable(bubbleDrawable);
}
// 设置内边距,让文字不会贴边
int padding = dpToPx(context, 10);
messageTextView.setPadding(padding, padding, padding, padding);
}
@Override
public void onLoadFailed() {
// 加载失败,使用默认背景
messageTextView.setBackgroundResource(com.xscm.moduleutil.R.drawable.ease_row_pubilc_user_bg);
}
});
}
private int dpToPx(Context context, int dp) {
return (int) (dp * context.getResources().getDisplayMetrics().density);
}
@Override
public void onViewRecycled(@NonNull BaseViewHolder holder) {
Logger.e("onViewRecycled", "onViewRecycled");
// AdaptiveImageView imEmj = (AdaptiveImageView)holder.getView(com.xscm.moduleutil.R.id.im_emj);
MeHeadView avatarOvalView = holder.getView(com.xscm.moduleutil.R.id.avatar);
ImageView ivNobility = holder.getView(com.xscm.moduleutil.R.id.iv_nobility);
ImageView ivCharm = holder.getView(com.xscm.moduleutil.R.id.iv_charm);
if (mContext instanceof Activity && (((Activity) mContext).isFinishing() || ((Activity) mContext).isDestroyed())) {
return;
}
try {
// 清理表情图片
if (holder.getView(com.xscm.moduleutil.R.id.im_emj) != null) {
ImageView imEmj = (ImageView) holder.getView(com.xscm.moduleutil.R.id.im_emj);
imEmj.setTag(null);
imEmj.setImageDrawable(null);
Glide.with(imEmj.getContext()).clear(imEmj);
}
// 清理其他图片
if (avatarOvalView != null) {
Glide.with(avatarOvalView.getContext()).clear(avatarOvalView);
}
if (ivNobility != null) {
ivNobility.setImageDrawable(null);
Glide.with(ivNobility.getContext()).clear(ivNobility);
}
if (ivCharm != null) {
ivCharm.setImageDrawable(null);
Glide.with(ivCharm.getContext()).clear(ivCharm);
}
} 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) {
// 添加到对应的存储列表
addToStorageLists(data);
// 维护数据量限制
maintainDataLimits();
// 根据显示类型决定是否添加到适配器
if (shouldAddToAdapter(data)) {
super.addData(data);
// 确保适配器数据量也不超过限制
if (mData.size() > 100) {
int removeCount = mData.size() - 100;
mData.subList(0, removeCount).clear();
notifyDataSetChanged();
}
}
}
private void addToStorageLists(EMMessageInfo data) {
switch (data.getItemType()) {
case 1: // 系统消息
allMsgList.add(data);
break;
case 2: // 用户消息
userMsgList.add(data);
allMsgList.add(data);
break;
case 3: // 系统消息类型3
systemMsgList.add(data);
allMsgList.add(data);
break;
}
}
private void maintainDataLimits() {
// 确保所有存储列表都不超过最大限制
trimListToMaxSize(allMsgList);
trimListToMaxSize(userMsgList);
trimListToMaxSize(systemMsgList);
}
private void trimListToMaxSize(List<EMMessageInfo> list) {
if (list.size() > 100) {
int removeCount = list.size() - 100;
list.subList(0, removeCount).clear();
}
}
private boolean shouldAddToAdapter(EMMessageInfo data) {
// return (listShowType == SHOW_TYPE_ALL && (data.getItemType() == 1 || data.getItemType() == 2)) ||
// (listShowType == SHOW_TYPE_USER && data.getItemType() == 2) ||
// (listShowType == SHOW_TYPE_SYSTEM && data.getItemType() == 3);
return true;
}
@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));
}
}
}