一、先看下效果图
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());
如果还有问题请私信我或者评论。
网友评论