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.utils.ImageUtils; 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; /** * @author xf */ public class EaseChatAdapter extends BaseMultiItemQuickAdapter { // 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 allMsgList; private List userMsgList; private List 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 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 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 findAllOccurrencesOfString(String text, String searchString) { List 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); 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()); 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 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() { @Override public void onResourceReady(@NonNull Drawable resource, @Nullable Transition 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) { // 为每个加载任务设置唯一标识 String uniqueId = emMessage.getRoomId() + "_" + helper.getLayoutPosition(); emojiImageView.setTag(uniqueId); if (Objects.equals(emMessage.getText().getEmoji().getAnimate_image(), "") || emMessage.getText().getEmoji().getAnimate_image().isEmpty()) { // 检查视图是否仍属于当前数据项 if (uniqueId.equals(emojiImageView.getTag())) { ImageUtils.loadHeadCC(emMessage.getText().getEmoji().getImage(), emojiImageView); } return; } // 使用 RequestListener 监听加载完成 Glide.with(mContext) .load(emMessage.getText().getEmoji().getAnimate_image()) .listener(new RequestListener() { @Override public boolean onResourceReady(Drawable resource, Object model, Target 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 target, boolean isFirstResource) { return false; } }) .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() { // @Override // public void onResourceReady(@NonNull Drawable resource, @Nullable Transition 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 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() { // @Override // public void onResourceReady(@NonNull Drawable drawable, @Nullable Transition 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 = ""; //前面加一个铃铛 // 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 = ""; //前面加一个铃铛 // 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); GifAvatarOvalView 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) { avatarOvalView.setImageDrawable(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 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 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 newData) { // super.addData(newData); if (newData == null || newData.size() == 0) { return; } List list = new ArrayList<>(); list.addAll(newData); for (int i = 0; i < list.size(); i++) { addData(list.get(i)); } } }