美文网首页消零燕归来简书的点点滴滴
融云自定义消息列表item的布局

融云自定义消息列表item的布局

作者: 你的益达233 | 来源:发表于2021-06-30 16:42 被阅读0次

    一、先看下效果图

    my_list_item.png

    图中:新人和领金币标签在融云默认的ui中是没有的。这功能该怎么实现呢

    二、思路分析

    因为它只是在原来的基础上添加了两个ui而已,所以还没到需要自定义消息会话程度,不过好像也是自定义消息。首先想到的是在rc_item_base_conversation布局里面添加相应的ui。但是添加完,如何获取到这ui,进行赋值操作呢。

    下面我们开始吧

    步骤一、rc_item_base_conversation中添加相应的ui

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="64dp"
    android:gravity="center_vertical"
    android:layout_marginLeft="5dp"
    android:layout_marginRight="14dp"
    android:background="@android:color/transparent">
    
    <LinearLayout
        android:id="@+id/rc_layout"
        android:layout_width="match_parent"
        android:layout_height="22dp"
        android:layout_marginLeft="5dp"
        android:layout_marginRight="14dp"
        android:layout_marginTop="8dp"
        android:orientation="horizontal">
    
        <TextView
            android:id="@id/rc_conversation_title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:background="@android:color/transparent"
            android:ellipsize="end"
            android:singleLine="true"
            android:textColor="@color/rc_text_color_primary"
            android:textSize="@dimen/rc_conversation_item_name_size" />
    
        <TextView
            android:id="@+id/tv_new_user_flag"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="@dimen/s16px"
            android:textColor="@color/c_f02fa1"
            android:paddingLeft="4dp"
            android:paddingTop="2dp"
            android:paddingRight="4dp"
            android:paddingBottom="2dp"
            android:text="@string/new_user"
            android:background="@drawable/msg_list_new_user_tag_shape"
            android:layout_marginLeft="6dp"
            android:visibility="gone"
            />
    
        <TextView
            android:id="@+id/tv_get_gold"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textColor="@color/white"
            android:textSize="@dimen/s16px"
            android:paddingLeft="4dp"
            android:paddingTop="2dp"
            android:paddingRight="4dp"
            android:paddingBottom="2dp"
            android:text="@string/get_gold_tag"
            android:layout_marginLeft="6dp"
            android:background="@drawable/msg_list_get_gold_tag_shape"
            android:visibility="gone"
            />
    
        <!--占空间作用-->
        <View
            android:layout_width="0dp"
            android:layout_height="1px"
            android:layout_weight="1"/>
    
        <TextView
            android:id="@id/rc_conversation_time"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@android:color/transparent"
            android:gravity="right|top"
            android:textColor="@color/rc_text_color_secondary"
            android:textSize="@dimen/rc_conversation_item_time_size" />
    </LinearLayout>
    
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/rc_layout"
        android:layout_marginBottom="8dp"
        android:layout_marginLeft="5dp"
        android:layout_marginRight="14dp">
    
        <TextView
            android:id="@id/rc_conversation_content"
            android:layout_width="231dp"
            android:layout_height="wrap_content"
            android:layout_centerVertical="true"
            android:background="@android:color/transparent"
            android:ellipsize="end"
            android:gravity="center_vertical"
            android:paddingTop="1dp"
            android:singleLine="true"
            android:textColor="@color/rc_text_color_secondary"
            android:textSize="@dimen/rc_conversation_item_data_size" />
    
        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_centerVertical="true"
            android:orientation="horizontal"
            android:paddingTop="1dp">
    
            <ImageView
                android:id="@id/rc_conversation_status"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:src="@drawable/rc_read_receipt"
                android:visibility="gone" />
    
            <ImageView
                android:id="@+id/rc_conversation_msg_block"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="8dp"
                android:src="@drawable/rc_ic_message_block"
                android:visibility="gone" />
    
        </LinearLayout>
    
    </RelativeLayout>
    

    </RelativeLayout>

    如:tv_new_user_flag TextView控件,还有些爆红不要紧,运行不会出错的。

    步骤二、关键的一步 自定义RongPrivateConversationProvider类

    名字随你起,原来会话的显示是用PrivateConversationProvider,只是它是封装的,我没办法去修改它的代码。那么就想我能不能建一个和PrivateConversationProvider一样的代码,然后注册它,系统就用它不用PrivateConversationProvider了。希望你细品

    RongPrivateConversationProvider类:

    @ConversationProviderTag(
        conversationType = "private",
        portraitPosition = 1
    )
    public class RongPrivateConversationProvider implements IContainerItemProvider.ConversationProvider<UIConversation> {
    private static final String TAG = "RongPrivateConversationProvider";
    
    public RongPrivateConversationProvider() {
    }
    
    public View newView(Context context, ViewGroup viewGroup) {
        View result = LayoutInflater.from(context).inflate(layout.rc_item_base_conversation, (ViewGroup)null);
        RongPrivateConversationProvider.ViewHolder holder = new RongPrivateConversationProvider.ViewHolder();
        holder.title = (TextView)result.findViewById(id.rc_conversation_title);
        holder.time = (TextView)result.findViewById(id.rc_conversation_time);
        holder.content = (TextView)result.findViewById(id.rc_conversation_content);
        holder.notificationBlockImage = (ImageView)result.findViewById(id.rc_conversation_msg_block);
        holder.readStatus = (ImageView)result.findViewById(id.rc_conversation_status);
        holder.tv_get_gold = (TextView)result.findViewById(R.id.tv_get_gold);
        holder.tv_new_user_flag = (TextView)result.findViewById(R.id.tv_new_user_flag);
        result.setTag(holder);
        return result;
    }
    
    private void handleMentionedContent(final RongPrivateConversationProvider.ViewHolder holder, final View view, final UIConversation data) {
    
        final SpannableStringBuilder builder = new SpannableStringBuilder();
        final String preStr = view.getContext().getString(string.rc_message_content_mentioned);
        if (holder.content.getWidth() > 60) {
            CharSequence cutStr = TextUtils.ellipsize(preStr + " " + data.getConversationContent(), holder.content.getPaint(), (float)(holder.content.getWidth() - 60), TextUtils.TruncateAt.END);
            SpannableString string = new SpannableString(cutStr);
            int colorSpanLength = preStr.length();
            if (colorSpanLength > cutStr.length()) {
                colorSpanLength = cutStr.length();
            }
    
            string.setSpan(new ForegroundColorSpan(view.getContext().getResources().getColor(color.rc_mentioned_color)), 0, colorSpanLength, 33);
            builder.append(string);
            AndroidEmoji.ensure(builder);
            holder.content.setText(builder, TextView.BufferType.SPANNABLE);
        } else {
            holder.content.post(new Runnable() {
                public void run() {
                    SpannableString str;
                    if (holder.content.getWidth() > 60) {
                        CharSequence cutStr = TextUtils.ellipsize(preStr + " " + data.getConversationContent(), holder.content.getPaint(), (float)(holder.content.getWidth() - 40), TextUtils.TruncateAt.END);
                        str = new SpannableString(cutStr);
                        int colorSpanLength = preStr.length();
                        if (colorSpanLength > cutStr.length()) {
                            colorSpanLength = cutStr.length();
                        }
    
                        str.setSpan(new ForegroundColorSpan(view.getContext().getResources().getColor(color.rc_mentioned_color)), 0, colorSpanLength, 33);
                        builder.append(str);
                    } else {
                        String oriStr = preStr + " " + data.getConversationContent();
                        str = new SpannableString(oriStr);
                        str.setSpan(new ForegroundColorSpan(view.getContext().getResources().getColor(color.rc_mentioned_color)), 0, preStr.length(), 33);
                        builder.append(str);
                    }
    
                    AndroidEmoji.ensure(builder);
                    holder.content.setText(builder, TextView.BufferType.SPANNABLE);
                }
            });
        }
    
    }
    
    private void handleDraftContent(final RongPrivateConversationProvider.ViewHolder holder, final View view, final UIConversation data) {
    
        final SpannableStringBuilder builder = new SpannableStringBuilder();
        final String preStr = view.getContext().getString(string.rc_message_content_draft);
        if (holder.content.getWidth() > 60) {
            CharSequence cutStr = TextUtils.ellipsize(preStr + " " + data.getDraft(), holder.content.getPaint(), (float)(holder.content.getWidth() - 60), TextUtils.TruncateAt.END);
            SpannableString string = new SpannableString(cutStr);
            int colorSpanLength = preStr.length();
            if (colorSpanLength > cutStr.length()) {
                colorSpanLength = cutStr.length();
            }
    
            string.setSpan(new ForegroundColorSpan(view.getContext().getResources().getColor(color.rc_draft_color)), 0, colorSpanLength, 33);
            builder.append(string);
            AndroidEmoji.ensure(builder);
            holder.content.setText(builder, TextView.BufferType.SPANNABLE);
        } else {
            holder.content.post(new Runnable() {
                public void run() {
                    SpannableString str;
                    if (holder.content.getWidth() > 60) {
                        CharSequence cutStr = TextUtils.ellipsize(preStr + " " + data.getDraft(), holder.content.getPaint(), (float)(holder.content.getWidth() - 60), TextUtils.TruncateAt.END);
                        str = new SpannableString(cutStr);
                        int colorSpanLength = preStr.length();
                        if (colorSpanLength > cutStr.length()) {
                            colorSpanLength = cutStr.length();
                        }
    
                        str.setSpan(new ForegroundColorSpan(view.getContext().getResources().getColor(color.rc_draft_color)), 0, colorSpanLength, 33);
                        builder.append(str);
                    } else {
                        String oriStr = preStr + " " + data.getDraft();
                        str = new SpannableString(oriStr);
                        str.setSpan(new ForegroundColorSpan(view.getContext().getResources().getColor(color.rc_draft_color)), 0, preStr.length(), 33);
                        builder.append(str);
                    }
    
                    AndroidEmoji.ensure(builder);
                    holder.content.setText(builder, TextView.BufferType.SPANNABLE);
                }
            });
        }
    
    }
    
    private void handleCommonContent(final RongPrivateConversationProvider.ViewHolder holder, UIConversation data) {
    
        if (holder.content.getWidth() > 60 && data.getConversationContent() != null) {
            CharSequence cutStr = TextUtils.ellipsize(data.getConversationContent(), holder.content.getPaint(), (float)(holder.content.getWidth() - 60), TextUtils.TruncateAt.END);
            holder.content.setText(cutStr, TextView.BufferType.SPANNABLE);
        } else {
            final CharSequence cutStr = data.getConversationContent();
            holder.content.post(new Runnable() {
                public void run() {
                    if (holder.content.getWidth() > 60 && cutStr != null) {
                        CharSequence str = TextUtils.ellipsize(cutStr, holder.content.getPaint(), (float)(holder.content.getWidth() - 60), TextUtils.TruncateAt.END);
                        holder.content.setText(str, TextView.BufferType.SPANNABLE);
                    } else {
                        holder.content.setText(cutStr);
                    }
    
                }
            });
        }
    
    }
    
    public void bindView(View view, int position, UIConversation data) {
        RongPrivateConversationProvider.ViewHolder holder = (RongPrivateConversationProvider.ViewHolder)view.getTag();
        ProviderTag tag = null;
        if (data == null) {
            holder.title.setText((CharSequence)null);
            holder.time.setText((CharSequence)null);
            holder.content.setText((CharSequence)null);
        } else {
            setNewUserAndGoldTag(data.getConversationTargetId(),holder.tv_new_user_flag,holder.tv_get_gold);
            holder.title.setText(data.getUIConversationTitle());
            String time = RongDateUtils.getConversationListFormatDate(data.getUIConversationTime(), view.getContext());
            holder.time.setText(time);
            if (TextUtils.isEmpty(data.getDraft()) && !data.getMentionedFlag()) {
                boolean readRec = false;
    
                try {
                    readRec = view.getResources().getBoolean(bool.rc_read_receipt);
                } catch (Resources.NotFoundException var10) {
                    RLog.e("RongPrivateConversationProvider", "rc_read_receipt not configure in rc_config.xml");
                    var10.printStackTrace();
                }
    
                if (readRec) {
                    if (data.getSentStatus() == Message.SentStatus.READ && data.getConversationSenderId().equals(RongIM.getInstance().getCurrentUserId()) && !(data.getMessageContent() instanceof RecallNotificationMessage)) {
                        holder.readStatus.setVisibility(View.VISIBLE);
                    } else {
                        holder.readStatus.setVisibility(View.GONE);
                    }
                }
    
                this.handleCommonContent(holder, data);
            } else {
                if (data.getMentionedFlag()) {
                    this.handleMentionedContent(holder, view, data);
                } else {
                    this.handleDraftContent(holder, view, data);
                }
    
                holder.readStatus.setVisibility(View.GONE);
            }
    
            if (RongContext.getInstance() != null && data.getMessageContent() != null) {
                tag = RongContext.getInstance().getMessageProviderTag(data.getMessageContent().getClass());
            }
    
            if (data.getSentStatus() != null && (data.getSentStatus() == Message.SentStatus.FAILED || data.getSentStatus() == Message.SentStatus.SENDING) && tag != null && tag.showWarning() && data.getConversationSenderId() != null && data.getConversationSenderId().equals(RongIM.getInstance().getCurrentUserId()) && TextUtils.isEmpty(data.getDraft())) {
                Bitmap bitmap = BitmapFactory.decodeResource(view.getResources(), drawable.rc_conversation_list_msg_send_failure);
                int width = bitmap.getWidth();
                Drawable drawable = null;
                if (data.getSentStatus() == Message.SentStatus.FAILED && TextUtils.isEmpty(data.getDraft())) {
                    if (ResendManager.getInstance().needResend(data.getLatestMessageId())) {
    
                        drawable = view.getContext().getResources().getDrawable(R.drawable.rc_conversation_list_msg_sending);
                    } else {
                        drawable = view.getContext().getResources().getDrawable(R.drawable.rc_conversation_list_msg_send_failure);
                    }
                } else if (data.getSentStatus() == Message.SentStatus.SENDING && TextUtils.isEmpty(data.getDraft())) {
                    drawable = view.getContext().getResources().getDrawable(R.drawable.rc_conversation_list_msg_sending);
                }
    
                if (drawable != null) {
                    drawable.setBounds(0, 0, width, width);
                    holder.content.setCompoundDrawablePadding(10);
                    holder.content.setCompoundDrawables(drawable, (Drawable)null, (Drawable)null, (Drawable)null);
                }
            } else {
                holder.content.setCompoundDrawables((Drawable)null, (Drawable)null, (Drawable)null, (Drawable)null);
            }
    
            Conversation.ConversationNotificationStatus status = data.getNotificationStatus();
            if (status != null && status.equals(Conversation.ConversationNotificationStatus.DO_NOT_DISTURB)) {
                holder.notificationBlockImage.setVisibility(View.VISIBLE);
            } else {
                holder.notificationBlockImage.setVisibility(View.GONE);
            }
        }
    
    }
    
    
    
    public Spannable getSummary(UIConversation data) {
        return null;
    }
    
    public String getTitle(String userId) {
        UserInfo userInfo = RongUserInfoManager.getInstance().getUserInfo(userId);
        return userInfo == null ? userId : userInfo.getName();
    }
    
    public Uri getPortraitUri(String userId) {
        UserInfo userInfo = RongUserInfoManager.getInstance().getUserInfo(userId);
        return userInfo == null ? null : userInfo.getPortraitUri();
    }
    
    protected class ViewHolder {
        public TextView title;
        public TextView time;
        public TextView content;
        public ImageView notificationBlockImage;
        public ImageView readStatus;
        public TextView tv_get_gold;
        public TextView tv_new_user_flag;
    
        protected ViewHolder() {
        }
    }
    }  
    

    看到没,这样我们就可以操作新增的View了

    步骤三、别忘了注册会话类型

    RongIM.getInstance().registerConversationTemplate(new RongPrivateConversationProvider());  
    

    如果还有问题请私信我或者评论。

    相关文章

      网友评论

        本文标题:融云自定义消息列表item的布局

        本文链接:https://www.haomeiwen.com/subject/qpvrultx.html