2025-10-28 16:56:13 +08:00
|
|
|
|
package com.xscm.modulemain.adapter;
|
2025-10-20 10:16:44 +08:00
|
|
|
|
|
|
|
|
|
|
import android.app.Activity;
|
2025-10-24 17:52:11 +08:00
|
|
|
|
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;
|
2025-10-20 10:16:44 +08:00
|
|
|
|
import android.view.View;
|
|
|
|
|
|
import android.widget.ImageView;
|
|
|
|
|
|
import android.widget.LinearLayout;
|
|
|
|
|
|
|
|
|
|
|
|
import androidx.annotation.NonNull;
|
2025-10-24 17:52:11 +08:00
|
|
|
|
import androidx.annotation.Nullable;
|
|
|
|
|
|
import androidx.constraintlayout.widget.ConstraintLayout;
|
2025-10-28 16:56:13 +08:00
|
|
|
|
|
2025-10-20 10:16:44 +08:00
|
|
|
|
import com.bumptech.glide.Glide;
|
2025-10-24 17:52:11 +08:00
|
|
|
|
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;
|
2025-10-20 10:16:44 +08:00
|
|
|
|
import com.chad.library.adapter.base.BaseMultiItemQuickAdapter;
|
|
|
|
|
|
import com.chad.library.adapter.base.BaseViewHolder;
|
2025-10-28 16:56:13 +08:00
|
|
|
|
import com.xscm.modulemain.R;
|
2025-10-24 17:52:11 +08:00
|
|
|
|
import com.xscm.modulemain.FakeNinePatchDrawable;
|
|
|
|
|
|
import com.xscm.moduleutil.bean.GiftBean;
|
2025-10-20 10:16:44 +08:00
|
|
|
|
import com.xscm.moduleutil.bean.RoomMessageEvent;
|
2025-10-24 17:52:11 +08:00
|
|
|
|
import com.xscm.moduleutil.bean.UserInfo;
|
2025-10-20 10:16:44 +08:00
|
|
|
|
import com.xscm.moduleutil.bean.room.EMMessageInfo;
|
2025-11-12 16:42:51 +08:00
|
|
|
|
import com.xscm.moduleutil.bean.room.EmotionDeatils;
|
2025-10-20 10:16:44 +08:00
|
|
|
|
import com.xscm.moduleutil.utils.ImageUtils;
|
2025-11-12 16:42:51 +08:00
|
|
|
|
import com.xscm.moduleutil.utils.MeHeadView;
|
2025-10-20 10:16:44 +08:00
|
|
|
|
import com.xscm.moduleutil.utils.logger.Logger;
|
2025-10-25 18:07:21 +08:00
|
|
|
|
import com.xscm.moduleutil.widget.AdaptiveImageView;
|
2025-10-24 17:52:11 +08:00
|
|
|
|
import com.xscm.moduleutil.widget.GifAvatarOvalView;
|
|
|
|
|
|
import com.xscm.moduleutil.widget.img.BubbleBackgroundHelper;
|
2025-10-20 10:16:44 +08:00
|
|
|
|
|
|
|
|
|
|
import java.util.ArrayList;
|
|
|
|
|
|
import java.util.Collection;
|
|
|
|
|
|
import java.util.List;
|
2025-10-24 17:52:11 +08:00
|
|
|
|
import java.util.Objects;
|
2025-11-12 16:42:51 +08:00
|
|
|
|
import java.util.Optional;
|
2025-10-20 10:16:44 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @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;
|
2025-10-24 17:52:11 +08:00
|
|
|
|
private String messageNameColor = "#00C8FF";//名称的颜色
|
|
|
|
|
|
private String messageGiftColor = "#FFE309";//礼物的颜色
|
2025-10-20 10:16:44 +08:00
|
|
|
|
|
|
|
|
|
|
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);//用户发送的消息
|
2025-10-27 20:09:12 +08:00
|
|
|
|
addItemType(3, com.xscm.moduleutil.R.layout.ease_row_received_message_system);//加入房间 、赠送礼物、上下麦、禁言 2025年6月12日15:42:08,让和聊天显示的是同一个额布局,后面需要修改
|
2025-10-20 10:16:44 +08:00
|
|
|
|
// 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);
|
2025-10-24 17:52:11 +08:00
|
|
|
|
}
|
|
|
|
|
|
if (type == SHOW_TYPE_USER) {
|
2025-10-20 10:16:44 +08:00
|
|
|
|
currData.addAll(userMsgList);
|
2025-10-24 17:52:11 +08:00
|
|
|
|
}
|
|
|
|
|
|
if (type == SHOW_TYPE_SYSTEM) {
|
2025-10-20 10:16:44 +08:00
|
|
|
|
currData.addAll(systemMsgList);
|
|
|
|
|
|
}
|
|
|
|
|
|
setNewData(currData);
|
|
|
|
|
|
//notifyDataSetChanged();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-10-24 17:52:11 +08:00
|
|
|
|
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;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-10-20 10:16:44 +08:00
|
|
|
|
@Override
|
|
|
|
|
|
protected void convert(BaseViewHolder helper, EMMessageInfo item) {
|
|
|
|
|
|
RoomMessageEvent emMessage = item.getEmMessage();
|
2025-10-25 18:07:21 +08:00
|
|
|
|
// 重置 ImageView 状态,防止复用导致的图片错乱
|
2025-10-24 17:52:11 +08:00
|
|
|
|
|
2025-10-20 10:16:44 +08:00
|
|
|
|
switch (helper.getItemViewType()) {
|
|
|
|
|
|
case 1:
|
|
|
|
|
|
helper.getView(R.id.tv_content).setVisibility(View.VISIBLE);
|
2025-10-24 17:52:11 +08:00
|
|
|
|
helper.setText(R.id.tv_content, getSpannable(emMessage));
|
|
|
|
|
|
|
|
|
|
|
|
// helper.setText(R.id.tv_content, emMessage.getText().getText());
|
|
|
|
|
|
// tv_content.setTextColor(ColorManager.getInstance().getPrimaryColorInt());
|
2025-10-20 10:16:44 +08:00
|
|
|
|
break;
|
|
|
|
|
|
case 2:
|
2025-10-25 18:07:21 +08:00
|
|
|
|
AdaptiveImageView emojiImageView = helper.getView(com.xscm.moduleutil.R.id.im_emj);
|
|
|
|
|
|
emojiImageView.setTag("");
|
|
|
|
|
|
Glide.with(mContext).clear(emojiImageView);
|
|
|
|
|
|
emojiImageView.setVisibility(View.VISIBLE);
|
2025-10-24 17:52:11 +08:00
|
|
|
|
helper.getView(com.xscm.moduleutil.R.id.tv_content).setVisibility(View.GONE);
|
|
|
|
|
|
|
2025-11-12 16:42:51 +08:00
|
|
|
|
MeHeadView avatar = helper.getView(com.xscm.moduleutil.R.id.avatar);
|
|
|
|
|
|
avatar.setData(emMessage.getText().getFromUserInfo().getAvatar(), "", emMessage.getText().getFromUserInfo().getNobility_image());
|
2025-11-12 19:09:21 +08:00
|
|
|
|
// 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"));
|
2025-10-24 17:52:11 +08:00
|
|
|
|
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());
|
2025-10-20 10:16:44 +08:00
|
|
|
|
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(
|
2025-10-25 18:07:21 +08:00
|
|
|
|
helper.itemView.getContext().getResources().getDimensionPixelSize(com.xscm.moduleutil.R.dimen.dp_57),
|
|
|
|
|
|
helper.itemView.getContext().getResources().getDimensionPixelSize(com.xscm.moduleutil.R.dimen.dp_15)
|
2025-10-20 10:16:44 +08:00
|
|
|
|
);
|
|
|
|
|
|
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);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-10-24 17:52:11 +08:00
|
|
|
|
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);
|
|
|
|
|
|
}
|
2025-11-12 19:09:21 +08:00
|
|
|
|
if (emMessage.getText().getEmoji() != null && emMessage.getText().getEmoji().getAnimate_image() != null) {
|
2025-10-25 18:07:21 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 为每个加载任务设置唯一标识
|
|
|
|
|
|
String uniqueId = emMessage.getRoomId() + "_" + helper.getLayoutPosition();
|
|
|
|
|
|
emojiImageView.setTag(uniqueId);
|
|
|
|
|
|
|
2025-11-12 16:42:51 +08:00
|
|
|
|
//这段代码使用 Optional 链式调用安全地获取 emMessage 中的 animate_image 字段,避免空指针异常。如果任意环节为 null,则返回空字符串。
|
|
|
|
|
|
String animateImage = Optional.ofNullable(emMessage)
|
|
|
|
|
|
.map(RoomMessageEvent::getText)
|
|
|
|
|
|
.map(RoomMessageEvent.T::getEmoji)
|
|
|
|
|
|
.map(EmotionDeatils::getAnimate_image)
|
|
|
|
|
|
.orElse("");
|
2025-10-25 18:07:21 +08:00
|
|
|
|
|
2025-11-12 16:42:51 +08:00
|
|
|
|
// if (Objects.equals(emMessage.getText().getEmoji().getAnimate_image(), "") ||
|
|
|
|
|
|
// emMessage.getText().getEmoji().getAnimate_image().isEmpty()) {
|
2025-11-12 19:09:21 +08:00
|
|
|
|
if (!animateImage.isEmpty()) {
|
2025-10-25 18:07:21 +08:00
|
|
|
|
// 检查视图是否仍属于当前数据项
|
|
|
|
|
|
if (uniqueId.equals(emojiImageView.getTag())) {
|
|
|
|
|
|
ImageUtils.loadHeadCC(emMessage.getText().getEmoji().getImage(), emojiImageView);
|
|
|
|
|
|
}
|
2025-10-24 17:52:11 +08:00
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-11-12 16:42:51 +08:00
|
|
|
|
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;
|
2025-10-25 18:07:21 +08:00
|
|
|
|
}
|
2025-10-24 17:52:11 +08:00
|
|
|
|
|
2025-11-12 16:42:51 +08:00
|
|
|
|
@Override
|
|
|
|
|
|
public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target,
|
|
|
|
|
|
boolean isFirstResource) {
|
|
|
|
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
})
|
|
|
|
|
|
.into(emojiImageView);
|
2025-11-12 19:09:21 +08:00
|
|
|
|
} else {
|
2025-11-12 16:42:51 +08:00
|
|
|
|
Glide.with(mContext)
|
|
|
|
|
|
.load(emMessage.getText().getEmoji().getImage())
|
|
|
|
|
|
.into(emojiImageView);
|
|
|
|
|
|
}
|
2025-10-24 17:52:11 +08:00
|
|
|
|
} else {
|
|
|
|
|
|
helper.getView(com.xscm.moduleutil.R.id.tv_content).setVisibility(View.VISIBLE);
|
2025-10-25 18:07:21 +08:00
|
|
|
|
emojiImageView.setVisibility(View.GONE);
|
2025-10-24 17:52:11 +08:00
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 3:
|
2025-10-25 18:07:21 +08:00
|
|
|
|
// 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 {
|
2025-10-27 20:09:12 +08:00
|
|
|
|
// helper.getView(com.xscm.moduleutil.R.id.bubble1).setBackgroundResource(com.xscm.moduleutil.R.drawable.ease_row_pubilc_user_bg);
|
2025-10-25 18:07:21 +08:00
|
|
|
|
// }
|
|
|
|
|
|
// 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());
|
2025-10-24 17:52:11 +08:00
|
|
|
|
// helper.setText(com.xscm.moduleutil.R.id.tv_content, emMessage.getText().getText());
|
2025-10-27 20:09:12 +08:00
|
|
|
|
helper.getView(R.id.tv_content).setVisibility(View.VISIBLE);
|
|
|
|
|
|
helper.setText(R.id.tv_content, getSpannable(emMessage));
|
2025-10-25 18:07:21 +08:00
|
|
|
|
// 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);
|
|
|
|
|
|
// }
|
|
|
|
|
|
// }
|
2025-10-24 17:52:11 +08:00
|
|
|
|
|
2025-10-20 10:16:44 +08:00
|
|
|
|
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;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-10-24 17:52:11 +08:00
|
|
|
|
|
|
|
|
|
|
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);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-10-20 10:16:44 +08:00
|
|
|
|
@Override
|
|
|
|
|
|
public void onViewRecycled(@NonNull BaseViewHolder holder) {
|
|
|
|
|
|
Logger.e("onViewRecycled", "onViewRecycled");
|
2025-10-25 18:07:21 +08:00
|
|
|
|
// AdaptiveImageView imEmj = (AdaptiveImageView)holder.getView(com.xscm.moduleutil.R.id.im_emj);
|
2025-11-12 16:42:51 +08:00
|
|
|
|
MeHeadView avatarOvalView = holder.getView(com.xscm.moduleutil.R.id.avatar);
|
2025-10-20 10:16:44 +08:00
|
|
|
|
ImageView ivNobility = holder.getView(com.xscm.moduleutil.R.id.iv_nobility);
|
|
|
|
|
|
ImageView ivCharm = holder.getView(com.xscm.moduleutil.R.id.iv_charm);
|
2025-10-25 18:07:21 +08:00
|
|
|
|
|
2025-10-20 10:16:44 +08:00
|
|
|
|
if (mContext instanceof Activity && (((Activity) mContext).isFinishing() || ((Activity) mContext).isDestroyed())) {
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
2025-10-25 18:07:21 +08:00
|
|
|
|
|
2025-10-20 10:16:44 +08:00
|
|
|
|
try {
|
2025-10-25 18:07:21 +08:00
|
|
|
|
// 清理表情图片
|
|
|
|
|
|
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);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 清理其他图片
|
2025-10-24 17:52:11 +08:00
|
|
|
|
if (avatarOvalView != null) {
|
|
|
|
|
|
Glide.with(avatarOvalView.getContext()).clear(avatarOvalView);
|
|
|
|
|
|
}
|
2025-10-20 10:16:44 +08:00
|
|
|
|
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);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-10-25 18:07:21 +08:00
|
|
|
|
|
2025-10-20 10:16:44 +08:00
|
|
|
|
/**
|
|
|
|
|
|
* 清除数据
|
|
|
|
|
|
*
|
|
|
|
|
|
* @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) {
|
|
|
|
|
|
|
2025-10-24 17:52:11 +08:00
|
|
|
|
// 添加到对应的存储列表
|
|
|
|
|
|
addToStorageLists(data);
|
|
|
|
|
|
|
|
|
|
|
|
// 维护数据量限制
|
|
|
|
|
|
maintainDataLimits();
|
|
|
|
|
|
|
|
|
|
|
|
// 根据显示类型决定是否添加到适配器
|
|
|
|
|
|
if (shouldAddToAdapter(data)) {
|
2025-10-20 10:16:44 +08:00
|
|
|
|
super.addData(data);
|
2025-10-24 17:52:11 +08:00
|
|
|
|
// 确保适配器数据量也不超过限制
|
|
|
|
|
|
if (mData.size() > 100) {
|
|
|
|
|
|
int removeCount = mData.size() - 100;
|
|
|
|
|
|
mData.subList(0, removeCount).clear();
|
|
|
|
|
|
notifyDataSetChanged();
|
|
|
|
|
|
}
|
2025-10-20 10:16:44 +08:00
|
|
|
|
}
|
2025-10-24 17:52:11 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
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;
|
2025-10-20 10:16:44 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@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));
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|