直播间消息列表

This commit is contained in:
Martin
2024-07-23 17:46:35 +08:00
parent b5d4b88753
commit 5d0f29db42
40 changed files with 425 additions and 80 deletions

View File

@@ -176,7 +176,7 @@ dependencies {
//腾讯im
api 'com.tencent.imsdk:imsdk-plus:5.4.666'
api 'com.google.code.gson:gson:2.8.8'
api 'cn.rongcloud.sdk:rtc_lib:5.6.9' // 音视频通话基础能力库
api 'cn.rongcloud.sdk:rtc_lib:5.7.0' // 音视频通话基础能力库
//此处以集成 5.1.2 版本为例
api 'cn.rongcloud.sdk:im_lib:5.7.0'

View File

@@ -0,0 +1,341 @@
package com.yunbao.common.adapter;
import android.content.Context;
import android.text.Html;
import android.text.SpannableString;
import android.text.Spanned;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import com.yunbao.common.R;
import com.yunbao.common.glide.ImgLoader;
import com.yunbao.common.interfaces.OnRecyclerListRefreshListener;
import com.yunbao.common.manager.IMLoginManager;
import com.yunbao.common.message.content.MessageChatCardContent;
import com.yunbao.common.utils.AppManager;
import com.yunbao.common.utils.DateFormatUtil;
import com.yunbao.common.utils.StringUtil;
import com.yunbao.common.utils.ViewUtils;
import com.yunbao.common.utils.WordUtil;
import com.yunbao.common.views.weight.ViewClicksAntiShake;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import io.rong.imkit.IMCenter;
import io.rong.imkit.conversationlist.ConversationListAdapter;
import io.rong.imkit.conversationlist.model.BaseUiConversation;
import io.rong.imkit.conversationlist.model.SingleConversation;
import io.rong.imkit.utils.RouteUtils;
import io.rong.imkit.widget.adapter.ViewHolder;
import io.rong.imlib.RongIMClient;
import io.rong.imlib.model.Conversation;
import io.rong.imlib.model.Message;
import io.rong.message.TextMessage;
public class MainConversationListAdapter extends ConversationListAdapter {
public static final int TYPE_SEARCH_TITLE = 500;
public static final int TYPE_SEARCH_USER = 510;
public static final int TYPE_SEARCH_CHAT = 520;
private List<BaseUiConversation> srcList;
private Context mContext;
private boolean isChat = true;
private OnRecyclerListRefreshListener<List<BaseUiConversation>> onRefreshListener;
private Map<String, Integer> timerMap = new HashMap<>();
public MainConversationListAdapter(Context mContext) {
this.mContext = mContext;
}
public void setOnRefreshListener(OnRecyclerListRefreshListener<List<BaseUiConversation>> onRefreshListener) {
this.onRefreshListener = onRefreshListener;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
ViewHolder holder = null;
if (mContext == null) {
mContext = parent.getContext();
}
if (viewType == TYPE_SEARCH_TITLE) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_main_msg_search_title, parent, false);
holder = ViewHolder.createViewHolder(parent.getContext(), view);
} else if (viewType == TYPE_SEARCH_USER) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_main_msg_search_user, parent, false);
holder = ViewHolder.createViewHolder(parent.getContext(), view);
} else if (viewType == TYPE_SEARCH_CHAT) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_main_msg_search_chat, parent, false);
holder = ViewHolder.createViewHolder(parent.getContext(), view);
} else if (viewType != -200) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.rc_conversationlist_item, parent, false);
holder = ViewHolder.createViewHolder(parent.getContext(), view);
} else {
holder = super.onCreateViewHolder(parent, viewType);
}
return holder;
}
@Override
public int getItemViewType(int position) {
int type = super.getItemViewType(position);
if (mDataList.size() > position) {
String objectName = mDataList.get(position).mCore.getObjectName();
if (!StringUtil.isEmpty(objectName) && objectName.startsWith("SEARCH_USER")) {
type = TYPE_SEARCH_USER;
} else if (!StringUtil.isEmpty(objectName) && objectName.startsWith("SEARCH_CHAT")) {
type = TYPE_SEARCH_CHAT;
} else if (!StringUtil.isEmpty(objectName) && objectName.startsWith("SEARCH_TITLE")) {
type = TYPE_SEARCH_TITLE;
}
} else if (mDataList.isEmpty() || isEmpty() || srcList.isEmpty()) {
type = -200;
}
return type;
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
if (isEmpty() || mDataList.isEmpty()) {
bindEmpty(holder, position);
return;
}
if (getItemViewType(position) == TYPE_SEARCH_USER) {
bindUser(holder, position);
} else if (getItemViewType(position) == TYPE_SEARCH_CHAT) {
bindChat(holder, position);
} else if (getItemViewType(position) == TYPE_SEARCH_TITLE) {
bindTitle(holder, position);
} else if (getItemViewType(position) != -200) {
super.onBindViewHolder(holder, position);
}
if (getItemViewType(position) != -200) {
bindDefault(holder, position);
}
}
private void bindDefault(ViewHolder holder, int position) {
BaseUiConversation conversation = mDataList.get(position);
Log.i("列表", "bindDefault: 用户头像:" + conversation.mCore.getPortraitUrl());
Log.i("列表", "bindDefault: 用户名字:" + conversation.mCore.getConversationTitle());
ImgLoader.display(holder.getContext(), conversation.mCore.getPortraitUrl(), holder.getView(R.id.rc_conversation_portrait));
holder.setText(R.id.rc_conversation_title, conversation.mCore.getConversationTitle());
if (conversation.mCore.getSentTime() != -1 && holder.getView(R.id.rc_conversation_date) != null) {
holder.setText(R.id.rc_conversation_date, DateFormatUtil.getDateTimeString(conversation.mCore.getSentTime(), true, holder.getContext()));
holder.getView(R.id.rc_conversation_date).setVisibility(View.VISIBLE);
} else if (holder.getView(R.id.rc_conversation_date) != null) {
holder.getView(R.id.rc_conversation_date).setVisibility(View.GONE);
}
if (holder.getView(R.id.rc_conversation_live_status) == null || IMLoginManager.get(holder.getContext()).getAnchorB() != 1) {
return;
}
Integer timer = timerMap.get(mDataList.get(position).mCore.getTargetId());
if (timer == null) {
holder.getView(R.id.rc_conversation_live_status).setVisibility(View.GONE);
return;
}
if (timer >= 10) {
holder.setText(R.id.rc_conversation_live_status,
String.format(WordUtil.getNewString(R.string.message_chat_msg_look_live), timer)
);
holder.getView(R.id.rc_conversation_live_status).setVisibility(View.VISIBLE);
} else {
holder.getView(R.id.rc_conversation_live_status).setVisibility(View.GONE);
}
}
private void bindEmpty(ViewHolder holder, int position) {
if (isChat) {
ViewUtils.findViewById(holder.itemView, R.id.imageView, ImageView.class).setImageResource(R.mipmap.ic_message_not_chat_list);
ViewUtils.findViewById(holder.itemView, R.id.textView, TextView.class).setText(R.string.not_data_message_chat_list);
} else {
ViewUtils.findViewById(holder.itemView, R.id.imageView, ImageView.class).setImageResource(R.mipmap.ic_message_not_search);
ViewUtils.findViewById(holder.itemView, R.id.textView, TextView.class).setText(R.string.not_data_message_chat_list_search);
}
}
public void onFinish() {
if (onRefreshListener != null) {
Log.i("聊天数据源", "设置数据源: " + mDataList.size());
onRefreshListener.onFinish(mDataList);
}
}
@Override
public void setDataCollection(List<BaseUiConversation> data) {
List<BaseUiConversation> tmp = new ArrayList<>();
Log.i("聊天数据源", "setDataCollection: " + data.hashCode());
List<String> urls = new ArrayList<>();
if (srcList == null) {
srcList = new ArrayList<>();
}
mDataList.clear();
if (mContext == null)
mContext = AppManager.getInstance().getLastActivity();
for (BaseUiConversation item : data) {
if (urls.contains(item.mCore.getTargetId())) continue;
if (item.mConversationContent != null && item.mConversationContent.toString().contains("_method_")) {
IMCenter.getInstance().deleteMessages(Conversation.ConversationType.PRIVATE,
item.mCore.getTargetId(),
new int[]{item.mCore.getLatestMessageId()},
new RongIMClient.ResultCallback<Boolean>() {
public void onSuccess(Boolean aBoolean) {
Log.i("PDMessageInterceptor", "onSuccess: 删除成功:" + aBoolean + " " + item.mCore.getLatestMessageId());
}
@Override
public void onError(RongIMClient.ErrorCode errorCode) {
Log.i("PDMessageInterceptor", "onSuccess: 删除失败:" + errorCode);
}
}
);
IMCenter.getInstance().clearMessagesUnreadStatus(Conversation.ConversationType.PRIVATE, item.mCore.getTargetId(), null);
}
urls.add(item.mCore.getTargetId());
Log.i("聊天数据源", item.mCore.getConversationTitle() + "|" + item.mCore.getPortraitUrl() + "|" + item.mCore.getTargetId());
BaseUiConversation cn = new SingleConversation(mContext, item.mCore);
srcList.add(cn);
if (item.mCore.getConversationType() == Conversation.ConversationType.PRIVATE) {
if (item.mCore.getLatestMessage() instanceof MessageChatCardContent) {
item.mConversationContent = new SpannableString(WordUtil.getNewString(R.string.activity_msg_chat_list_card));
}
}
tmp.add(item);
}
// ToastUtil.showDebug("消息数:"+data.size());
super.setDataCollection(tmp);
}
public void clear() {
mDataList.clear();
if (srcList != null) {
srcList.clear();
}
}
public List<BaseUiConversation> getSrcList() {
if (srcList == null) {
srcList = new ArrayList<>();
}
return srcList;
}
private void bindTitle(ViewHolder holder, int position) {
holder.setText(R.id.title, mDataList.get(position).mCore.getObjectName().replace("SEARCH_TITLE", ""));
}
private void bindUser(ViewHolder holder, int position) {
ImgLoader.display(holder.getContext(), mDataList.get(position).mCore.getPortraitUrl(), holder.getView(R.id.rc_conversation_portrait));
String title = mDataList.get(position).mCore.getConversationTitle();
String key = mDataList.get(position).mCore.getObjectName().replace("SEARCH_USER", "");
title = title.replace(key, "<font color='#FF4874'>" + key + "</font>");
Spanned spanned = Html.fromHtml(title);
((TextView) holder.getView(R.id.rc_conversation_title)).setText(spanned);
int type = mDataList.get(position).mCore.getMentionedCount();
holder.getView(R.id.itemDecorationTop).setVisibility(View.GONE);
holder.getView(R.id.itemDecorationBottom).setVisibility(View.GONE);
if (type == 1) {
holder.itemView.setBackgroundResource(R.drawable.bg_msg_list_item_top);
holder.getView(R.id.itemDecorationBottom).setVisibility(View.VISIBLE);
} else if (type == 2) {
holder.itemView.setBackgroundResource(R.drawable.bg_msg_list_item_bottom);
} else if (type == 3) {
holder.itemView.setBackgroundResource(R.drawable.bg_msg_list_item);
} else {
holder.getView(R.id.itemDecorationBottom).setVisibility(View.VISIBLE);
holder.itemView.setBackgroundResource(R.drawable.bg_msg_list_item_centre);
}
ViewClicksAntiShake.clicksAntiShake(holder.itemView, new ViewClicksAntiShake.ViewClicksCallBack() {
@Override
public void onViewClicks() {
RouteUtils.routeToConversationActivity(holder.itemView.getContext(), mDataList.get(position).mCore.getConversationType(), mDataList.get(position).mCore.getTargetId());
}
});
}
private void bindChat(ViewHolder holder, int position) {
ImgLoader.display(holder.getContext(), mDataList.get(position).mCore.getPortraitUrl(), holder.getView(R.id.rc_conversation_portrait));
holder.setText(R.id.rc_conversation_title, mDataList.get(position).mCore.getConversationTitle());
String title = mDataList.get(position).mConversationContent.toString();
String key = mDataList.get(position).mCore.getObjectName().replace("SEARCH_CHAT", "");
title = title.replace(key, "<font color='#FF4874'>" + key + "</font>");
Spanned spanned = Html.fromHtml(WordUtil.getNewString(R.string.activity_msg_list_include) + title);
((TextView) holder.getView(R.id.rc_conversation_content)).setText(spanned);
int type = mDataList.get(position).mCore.getMentionedCount();
holder.getView(R.id.itemDecorationTop).setVisibility(View.GONE);
holder.getView(R.id.itemDecorationBottom).setVisibility(View.GONE);
if (type == 1) {
holder.itemView.setBackgroundResource(R.drawable.bg_msg_list_item_top);
holder.getView(R.id.itemDecorationBottom).setVisibility(View.VISIBLE);
} else if (type == 2) {
holder.itemView.setBackgroundResource(R.drawable.bg_msg_list_item_bottom);
} else if (type == 3) {
holder.itemView.setBackgroundResource(R.drawable.bg_msg_list_item);
} else {
holder.getView(R.id.itemDecorationBottom).setVisibility(View.VISIBLE);
holder.itemView.setBackgroundResource(R.drawable.bg_msg_list_item_centre);
}
ViewClicksAntiShake.clicksAntiShake(holder.itemView, new ViewClicksAntiShake.ViewClicksCallBack() {
@Override
public void onViewClicks() {
RouteUtils.routeToConversationActivity(holder.itemView.getContext(), mDataList.get(position).mCore.getConversationType(), mDataList.get(position).mCore.getTargetId());
}
});
}
public void setChat() {
isChat = true;
}
public void setSearch() {
isChat = false;
}
public void setTimerMap(Map<String, Integer> timerMap) {
this.timerMap.putAll(timerMap);
this.notifyDataSetChanged();
}
public int getMessageId(String senderUserId) {
for (int i = 0; i < mDataList.size(); i++) {
if (mDataList.get(i).mCore.getTargetId().equals(senderUserId)) {
return i;
}
}
return -1;
}
public void update(Message bean, int id) {
RongIMClient.getInstance().getUnreadCount(Conversation.ConversationType.PRIVATE, bean.getTargetId(), new RongIMClient.ResultCallback<Integer>() {
@Override
public void onSuccess(Integer integer) {
BaseUiConversation conversation = mDataList.get(id);
conversation.mCore.setSentTime(bean.getSentTime());
conversation.mCore.setUnreadMessageCount(integer);
conversation.mConversationContent = new SpannableString(((TextMessage) bean.getContent()).getContent());
mDataList.set(id, conversation);
notifyItemChanged(id);
}
@Override
public void onError(RongIMClient.ErrorCode e) {
BaseUiConversation conversation = mDataList.get(id);
conversation.mCore.setSentTime(bean.getSentTime());
conversation.mConversationContent = new SpannableString(((TextMessage) bean.getContent()).getContent());
mDataList.set(id, conversation);
notifyItemChanged(id);
}
});
}
}

View File

@@ -0,0 +1,133 @@
package com.yunbao.common.fragment;
import android.os.Bundle;
import android.view.View;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.RecyclerView;
import com.yunbao.common.bean.MainMessageChatListTimer;
import com.yunbao.common.http.base.HttpCallback;
import com.yunbao.common.http.live.LiveNetManager;
import com.yunbao.common.interfaces.OnRecyclerListRefreshListener;
import com.yunbao.common.adapter.MainConversationListAdapter;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import io.rong.imkit.conversationlist.model.BaseUiConversation;
import io.rong.imkit.widget.refresh.SmartRefreshLayout;
import io.rong.imlib.model.Conversation;
public abstract class AbsMainMessageChatListFragment extends Fragment {
public RecyclerView recyclerView;
public MainConversationListAdapter mAdapter;
public SmartRefreshLayout refreshLayout;
public void setAdapter(MainConversationListAdapter mAdapter) {
this.mAdapter = mAdapter;
}
public abstract void onChatList();
public abstract void search(String string);
public abstract void updateList();
public void onTest() {
}
public void onRefreshFinished() {
if (refreshLayout != null) {
refreshLayout.finishRefresh(true);
}
}
public void onLoadMoreFinished() {
if (refreshLayout != null) {
refreshLayout.finishLoadMore(true);
}
}
@Override
public void onResume() {
super.onResume();
updateList();
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
EventBus.getDefault().register(this);
}
@Override
public void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);
}
private static long lastTime;
private static boolean isNet = false;
Map<String, BaseUiConversation> map = new HashMap<>();
public void loadLiveLookTime(List<BaseUiConversation> srcList, OnRecyclerListRefreshListener<Map<String, Integer>> onRefreshListener) {
/* if (System.currentTimeMillis() - lastTime > 200 || isNet) {
for (BaseUiConversation conversation : srcList) {
if (map.containsKey(conversation.mCore.getTargetId())) {
return;
}
}
}*/
lastTime = System.currentTimeMillis();
isNet = true;
List<String> uids = new ArrayList<>();
for (BaseUiConversation conversation : srcList) {
map.put(conversation.mCore.getTargetId(), conversation);
if (conversation.mCore.getConversationType() == Conversation.ConversationType.PRIVATE) {
uids.add(conversation.mCore.getTargetId());
}
}
LiveNetManager.get(getContext())
.getIsLook(String.join(",", uids), new HttpCallback<>() {
@Override
public void onSuccess(List<MainMessageChatListTimer> data) {
Map<String, Integer> timerMap = new HashMap<>();
for (MainMessageChatListTimer timer : data) {
timerMap.put(timer.getUid(), timer.getTime());
}
onRefreshListener.onFinish(timerMap);
isNet = false;
}
@Override
public void onError(String error) {
isNet = false;
}
});
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void sendMessage(io.rong.imlib.model.Message bean) {
int id1 = mAdapter.getMessageId(bean.getSenderUserId());
int id2 = mAdapter.getMessageId(bean.getTargetId());
if (id1 != -1) {
mAdapter.update(bean, id1);
}
if (id2 != -1) {
mAdapter.update(bean, id2);
}
}
}

View File

@@ -0,0 +1,176 @@
package com.yunbao.common.fragment;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.lifecycle.Observer;
import com.google.gson.Gson;
import com.yunbao.common.R;
import com.yunbao.common.adapter.MainConversationListAdapter;
import com.yunbao.common.utils.DpUtil;
import com.yunbao.common.utils.L;
import com.yunbao.common.utils.StringUtil;
import com.yunbao.common.utils.ToastUtil;
import com.yunbao.common.utils.WordUtil;
import java.util.ArrayList;
import java.util.List;
import io.rong.imkit.conversationlist.ConversationListAdapter;
import io.rong.imkit.conversationlist.ConversationListFragment;
import io.rong.imkit.conversationlist.model.BaseUiConversation;
import io.rong.imkit.conversationlist.model.SingleConversation;
import io.rong.imkit.event.Event;
import io.rong.imlib.RongIMClient;
import io.rong.imlib.model.Conversation;
import io.rong.imlib.model.SearchConversationResult;
public class MainMessageChatFragment extends ConversationListFragment {
private static final String TAG = "融云列表";
int listHashCode = 0;
@Nullable
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
Log.i(TAG, "onCreateView: 创建融云");
return inflater.inflate(R.layout.rc_conversationlist_fragment, container, false);
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
Log.i(TAG, "onViewCreated:创建融云页面");
mConversationListViewModel.getConversationListLiveData().observe(this.getViewLifecycleOwner(), new Observer<List<BaseUiConversation>>() {
@Override
public void onChanged(List<BaseUiConversation> uiConversations) {
if (listHashCode != uiConversations.hashCode()) {
listHashCode = uiConversations.hashCode();
((MainConversationListAdapter) mAdapter).onFinish();
}
}
});
mConversationListViewModel.getRefreshEventLiveData().observe(this.getViewLifecycleOwner(), new Observer<Event.RefreshEvent>() {
@Override
public void onChanged(Event.RefreshEvent refreshEvent) {
listHashCode = 0;
}
});
}
public void setEmptyView(int viewLayoutMsgId) {
super.setEmptyView(viewLayoutMsgId);
}
public void setEmptyView(View view) {
super.setEmptyView(view);
}
public void search(String search) {
((MainConversationListAdapter) mAdapter).setSearch();
getContactsList(search);
}
public MainConversationListAdapter getAdapter() {
return (MainConversationListAdapter) mAdapter;
}
private void getContactsList(String search) {
List<BaseUiConversation> list = new ArrayList<>();
List<String> uidList = new ArrayList<>();
BaseUiConversation conversation = new SingleConversation(getContext(), new Conversation());
conversation.mCore.setObjectName("SEARCH_TITLE" + WordUtil.getNewString(R.string.activity_msg_list_title_contacts));
conversation.mCore.setConversationType(Conversation.ConversationType.PRIVATE);
list.add(conversation);
List<BaseUiConversation> data = new ArrayList<>();
System.err.println(" ----------------------->" + mAdapter.getData().size());
for (BaseUiConversation cn : ((MainConversationListAdapter) mAdapter).getSrcList()) {
System.err.println(" ----------------------->" + cn.mCore.getConversationTitle() + "|" + cn.mCore.getSenderUserName());
if (StringUtil.isEmpty(cn.mCore.getConversationTitle())) continue;
if (uidList.contains(cn.mCore.getTargetId())) continue;
uidList.add(cn.mCore.getTargetId());
if (cn.mCore.getConversationTitle().contains(search)) {
conversation = new SingleConversation(getContext(), new Conversation());
conversation.mCore.setObjectName("SEARCH_USER" + search);
conversation.mCore.setConversationTitle(cn.mCore.getConversationTitle());
conversation.mCore.setConversationType(Conversation.ConversationType.PRIVATE);
conversation.mCore.setPortraitUrl(cn.mCore.getPortraitUrl());
conversation.mCore.setTargetId(cn.mCore.getTargetId());
conversation.mCore.setSenderUserId(cn.mCore.getSenderUserId());
data.add(conversation);
}
}
if (data.size() == 1) {
data.get(0).mCore.setMentionedCount(3);
} else if (data.size() != 0) {
data.get(0).mCore.setMentionedCount(1);
data.get(data.size() - 1).mCore.setMentionedCount(2);
} else {
list.remove(list.size() - 1);
}
list.addAll(data);
getChatRecordList(list, search);
L.eSw(new Gson().toJson(list));
}
private void getChatRecordList(List<BaseUiConversation> list, String search) {
Conversation.ConversationType[] conversationTypes = {Conversation.ConversationType.PRIVATE};
String[] messageTypeObjectNames = {"RC:TxtMsg"};
RongIMClient.getInstance().searchConversations(search, conversationTypes, messageTypeObjectNames, new RongIMClient.ResultCallback<List<SearchConversationResult>>() {
@Override
public void onSuccess(List<SearchConversationResult> searchConversationResults) {
BaseUiConversation conversation = new SingleConversation(getContext(), new Conversation());
conversation.mCore.setObjectName("SEARCH_TITLE" + WordUtil.getNewString(R.string.activity_msg_list_title_chat_records));
conversation.mCore.setConversationType(Conversation.ConversationType.PRIVATE);
list.add(conversation);
List<BaseUiConversation> data = new ArrayList<>();
for (SearchConversationResult result : searchConversationResults) {
BaseUiConversation cn = new SingleConversation(getContext(), result.getConversation());
cn.mCore.setObjectName("SEARCH_CHAT" + search);
data.add(cn);
}
if (data.size() == 1) {
data.get(0).mCore.setMentionedCount(3);
} else if (data.size() != 0) {
data.get(0).mCore.setMentionedCount(1);
data.get(data.size() - 1).mCore.setMentionedCount(2);
} else {
list.remove(list.size() - 1);
}
list.addAll(data);
mAdapter.setDataCollection(list);
}
@Override
public void onError(RongIMClient.ErrorCode e) {
ToastUtil.show("搜索出错了:" + e.getMessage());
mAdapter.setDataCollection(list);
}
});
}
public void onChatList() {
if(mConversationListViewModel==null)return;
((MainConversationListAdapter) mAdapter).setChat();
((MainConversationListAdapter) mAdapter).clear();
System.out.println(">!>!>!>!!>"+mConversationListViewModel);
subscribeUi();
}
@Override
protected ConversationListAdapter onResolveAdapter() {
this.mAdapter = new MainConversationListAdapter(getContext());
return this.mAdapter;
}
}

View File

@@ -0,0 +1,89 @@
package com.yunbao.common.fragment;
import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.FragmentActivity;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction;
import com.yunbao.common.R;
import com.yunbao.common.interfaces.OnRecyclerListRefreshListener;
import com.yunbao.common.manager.InstructorRemarkManager;
import java.util.List;
import java.util.Map;
import io.rong.imkit.conversationlist.model.BaseUiConversation;
public class MainMessageChatListFragment extends AbsMainMessageChatListFragment {
private static final String TAG = "MainMessageChatListFragment";
private Context mContext;
public MainMessageChatListFragment(Context mContext) {
this.mContext =mContext;
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_main_message_chat_list, container, false);
}
MainMessageChatFragment conversationListFragment;
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
Log.i(TAG, "onViewCreated: 准备创建融云");
conversationListFragment = new MainMessageChatFragment();
setAdapter(conversationListFragment.getAdapter());
FragmentManager manager = ((FragmentActivity) mContext).getSupportFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
transaction.replace(view.findViewById(R.id.container).getId(), conversationListFragment);
transaction.commitAllowingStateLoss();
//自定义空数据背景View
//conversationListFragment.setEmptyView(emptyView);
conversationListFragment.setEmptyView(R.layout.view_layout_msg);
conversationListFragment.getAdapter().setOnRefreshListener(new OnRecyclerListRefreshListener<List<BaseUiConversation>>() {
@Override
public void onFinish(List<BaseUiConversation> baseUiConversations) {
InstructorRemarkManager.get(mContext).getNetInstructorRemark();
loadLiveLookTime(baseUiConversations, new OnRecyclerListRefreshListener<Map<String, Integer>>() {
@Override
public void onFinish(Map<String, Integer> stringIntegerMap) {
conversationListFragment.getAdapter().setTimerMap(stringIntegerMap);
updateList();
}
});
}
});
}
public void onChatList() {
if (conversationListFragment == null) {
return;
}
conversationListFragment.onChatList();
}
public void search(String string) {
if (conversationListFragment == null) {
return;
}
conversationListFragment.search(string);
}
@Override
public void updateList() {
}
}

View File

@@ -0,0 +1,51 @@
package com.yunbao.common.fragment;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.lifecycle.Observer;
import com.google.gson.Gson;
import com.yunbao.common.R;
import com.yunbao.common.adapter.MainConversationListAdapter;
import com.yunbao.common.utils.L;
import com.yunbao.common.utils.StringUtil;
import com.yunbao.common.utils.ToastUtil;
import com.yunbao.common.utils.WordUtil;
import java.util.ArrayList;
import java.util.List;
import io.rong.imkit.conversationlist.ConversationListAdapter;
import io.rong.imkit.conversationlist.ConversationListFragment;
import io.rong.imkit.conversationlist.model.BaseUiConversation;
import io.rong.imkit.conversationlist.model.SingleConversation;
import io.rong.imkit.event.Event;
import io.rong.imlib.RongIMClient;
import io.rong.imlib.model.Conversation;
import io.rong.imlib.model.SearchConversationResult;
public class MainMessageRecommendFragment extends ConversationListFragment {
@Nullable
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.msg_main_recommend_list_fragment, container, false);
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
}
}

View File

@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:width="344dp" android:height="60dp">
<shape android:shape="rectangle">
<solid android:color="#ffffffff" />
<corners android:topLeftRadius="15dp" android:topRightRadius="15dp" android:bottomLeftRadius="15dp" android:bottomRightRadius="15dp" />
</shape>
</item>
</selector>

View File

@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:width="344dp" android:height="60dp">
<shape android:shape="rectangle">
<solid android:color="#ffffffff" />
<corners android:bottomLeftRadius="15dp" android:bottomRightRadius="15dp" />
</shape>
</item>
</selector>

View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:width="344dp" android:height="60dp">
<shape android:shape="rectangle">
<solid android:color="#ffffffff" />
</shape>
</item>
</selector>

View File

@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:width="344dp" android:height="60dp">
<shape android:shape="rectangle">
<solid android:color="#ffffffff" />
<corners android:topLeftRadius="15dp" android:topRightRadius="15dp" />
</shape>
</item>
</selector>

View File

@@ -0,0 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:orientation="vertical"
android:layout_height="match_parent">
<FrameLayout
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginBottom="50dp" />
<LinearLayout
android:id="@+id/lt_nodata_msg"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:visibility="gone">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/img_no_new" />
</LinearLayout>
</LinearLayout>

View File

@@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/rc_conversation_item"
android:layout_width="match_parent"
android:background="@drawable/bg_msg_list_item"
android:layout_height="@dimen/rc_conversation_item_height">
<View
android:id="@+id/itemDecorationTop"
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="#FFE9F6"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<View
android:id="@+id/itemDecorationBottom"
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="#FFE9F6"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/constraintLayout5"
android:layout_width="match_parent"
android:layout_height="match_parent">
<RelativeLayout
android:id="@+id/rc_conversation_portrait_rl"
android:layout_width="48dp"
android:layout_height="48dp"
android:layout_marginStart="@dimen/rc_margin_size_12"
android:layout_marginTop="@dimen/rc_margin_size_12"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<com.yunbao.common.views.weight.ClipPathCircleImage
android:id="@+id/rc_conversation_portrait"
android:layout_width="54dp"
android:layout_height="54dp"
android:scaleType="centerCrop"
android:src="@mipmap/beauty_jingbai" />
<RelativeLayout
android:id="@+id/rc_conversation_unread"
android:visibility="gone"
tools:visibility="visible"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_alignParentEnd="true">
<ImageView
android:id="@+id/rc_conversation_unread_bg"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:src="@drawable/rc_unread_count_bg_normal" />
<TextView
android:id="@+id/rc_conversation_unread_count"
style="@style/TextStyle.Alignment"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="15"
android:textColor="@color/rc_white_color"
android:textSize="@dimen/rc_font_auxiliary_size" />
</RelativeLayout>
</RelativeLayout>
<TextView
android:id="@+id/rc_conversation_title"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/rc_margin_size_12"
android:layout_marginTop="@dimen/rc_margin_size_16"
android:layout_marginEnd="@dimen/rc_margin_size_12"
android:text="张三"
android:textColor="@color/rc_text_main_color"
android:textSize="13sp"
app:layout_constraintStart_toEndOf="@+id/rc_conversation_portrait_rl"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/rc_conversation_content"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="12dp"
android:layout_marginTop="4dp"
android:text="你好,朋友!"
android:textColor="#777777"
android:textSize="11sp"
app:layout_constraintEnd_toStartOf="@+id/btn"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toEndOf="@+id/rc_conversation_portrait_rl"
app:layout_constraintTop_toBottomOf="@+id/rc_conversation_title" />
<Button
android:id="@+id/btn"
android:layout_width="68dp"
android:layout_height="37dp"
android:layout_marginEnd="16dp"
tools:text="关注"
android:textAllCaps="false"
android:visibility="gone"
tools:visibility="visible"
android:background="@drawable/bg_msg_address_book_user_btn_mutual"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_marginTop="20dp"
android:layout_marginBottom="10dp"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#333333"
android:textSize="13sp"
tools:text="TextView" />
</LinearLayout>

View File

@@ -0,0 +1,109 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/rc_conversation_item"
android:background="@drawable/bg_msg_list_item"
android:layout_width="match_parent"
android:layout_height="@dimen/rc_conversation_item_height">
<View
android:id="@+id/itemDecorationTop"
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="#FFE9F6"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<View
android:id="@+id/itemDecorationBottom"
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="#FFE9F6"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/constraintLayout5"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_constraintBottom_toBottomOf="@+id/itemDecorationBottom"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@+id/itemDecorationTop">
<RelativeLayout
android:id="@+id/rc_conversation_portrait_rl"
android:layout_width="48dp"
android:layout_height="48dp"
android:layout_marginStart="@dimen/rc_margin_size_12"
android:layout_marginTop="@dimen/rc_margin_size_12"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<com.yunbao.common.views.weight.ClipPathCircleImage
android:id="@+id/rc_conversation_portrait"
android:layout_width="54dp"
android:layout_height="54dp"
android:scaleType="centerCrop"
android:src="@mipmap/beauty_jingbai" />
<RelativeLayout
android:id="@+id/rc_conversation_unread"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_alignParentEnd="true"
android:visibility="gone"
tools:visibility="visible">
<ImageView
android:id="@+id/rc_conversation_unread_bg"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:src="@drawable/rc_unread_count_bg_normal" />
<TextView
android:id="@+id/rc_conversation_unread_count"
style="@style/TextStyle.Alignment"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="15"
android:textColor="@color/rc_white_color"
android:textSize="@dimen/rc_font_auxiliary_size" />
</RelativeLayout>
</RelativeLayout>
<TextView
android:id="@+id/rc_conversation_content"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginStart="12dp"
android:layout_marginTop="4dp"
android:text="你好,朋友!"
android:visibility="gone"
android:textColor="#777777"
android:textSize="11sp"
app:layout_constraintEnd_toStartOf="@+id/rc_conversation_title"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toEndOf="@+id/rc_conversation_portrait_rl"
app:layout_constraintTop_toBottomOf="@+id/rc_conversation_title" />
<TextView
android:id="@+id/rc_conversation_title"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/rc_margin_size_12"
android:text="张三1234567890-"
android:textColor="@color/rc_text_main_color"
android:textSize="@dimen/rc_font_secondary_size"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@+id/rc_conversation_portrait_rl"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -0,0 +1,90 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/rc_conversation_item"
android:gravity="center_vertical"
android:layout_width="match_parent"
android:paddingStart="10dp"
android:paddingEnd="10dp"
android:orientation="horizontal"
android:layout_height="@dimen/rc_conversation_item_height">
<RelativeLayout
android:id="@+id/rc_conversation_portrait_rl"
android:layout_width="48dp"
android:layout_height="48dp"
>
<com.yunbao.common.views.weight.ClipPathCircleImage
android:id="@+id/rc_conversation_portrait"
android:layout_width="54dp"
android:layout_height="54dp"
android:scaleType="centerCrop"
android:src="@mipmap/beauty_jingbai" />
<RelativeLayout
android:id="@+id/rc_conversation_unread"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_alignParentEnd="true">
<ImageView
android:id="@+id/rc_conversation_unread_bg"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:src="@drawable/rc_unread_count_bg_normal" />
<TextView
android:id="@+id/rc_conversation_unread_count"
style="@style/TextStyle.Alignment"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="15"
android:textColor="@color/rc_white_color"
android:textSize="@dimen/rc_font_auxiliary_size" />
</RelativeLayout>
</RelativeLayout>
<LinearLayout
android:layout_marginLeft="10dp"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="match_parent">
<TextView
android:id="@+id/rc_conversation_title"
style="@style/TextStyle.Alignment"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="end"
android:maxWidth="120dp"
android:layout_gravity="center_vertical"
android:maxLines="1"
android:textColor="@color/rc_text_main_color"
android:textSize="@dimen/rc_font_secondary_size"
tools:text="张三11111111111111111111111" />
<TextView
android:id="@+id/rc_conversation_status"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="25dp"
android:singleLine="true"
android:textSize="8sp"
android:visibility="visible"
tools:text="在线" />
<ImageView
android:id="@+id/rc_conversation_status_icon"
android:layout_width="5dp"
android:layout_height="5dp"
android:src="@color/green_81c160"
android:layout_marginTop="25dp"
android:visibility="visible" />
</LinearLayout>
</LinearLayout>

View File

@@ -0,0 +1,23 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:gravity="bottom"
android:layout_height="match_parent"
android:orientation="vertical">
<io.rong.imkit.widget.refresh.SmartRefreshLayout
android:id="@+id/rc_refresh"
android:layout_marginStart="16dp"
android:layout_marginEnd="16dp"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rc_conversation_list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:overScrollMode="never"
tools:listitem="@layout/msg_main_recommend_item" />
</io.rong.imkit.widget.refresh.SmartRefreshLayout>
</LinearLayout>

View File

@@ -0,0 +1,28 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<include
android:id="@+id/rc_conversationlist_notice_container"
layout="@layout/rc_conversationlist_notice_view"
android:visibility="gone"
tools:visibility="visible" />
<io.rong.imkit.widget.refresh.SmartRefreshLayout
android:id="@+id/rc_refresh"
android:layout_marginStart="16dp"
android:layout_marginEnd="16dp"
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rc_conversation_list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:overScrollMode="never"
tools:listitem="@layout/rc_conversationlist_item" />
</io.rong.imkit.widget.refresh.SmartRefreshLayout>
</LinearLayout>

View File

@@ -0,0 +1,185 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/rc_conversation_item"
android:layout_width="match_parent"
android:layout_height="@dimen/rc_conversation_item_height">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<RelativeLayout
android:id="@+id/rc_conversation_portrait_rl"
android:layout_width="48dp"
android:layout_height="48dp"
android:layout_marginTop="@dimen/rc_margin_size_12"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<com.yunbao.common.views.weight.ClipPathCircleImage
android:id="@+id/rc_conversation_portrait"
android:layout_width="54dp"
android:layout_height="54dp"
android:scaleType="centerCrop"
android:src="@mipmap/beauty_jingbai" />
<RelativeLayout
android:id="@+id/rc_conversation_unread"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_alignParentEnd="true">
<ImageView
android:id="@+id/rc_conversation_unread_bg"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:src="@drawable/rc_unread_count_bg_normal" />
<TextView
android:id="@+id/rc_conversation_unread_count"
style="@style/TextStyle.Alignment"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="15"
android:textColor="@color/rc_white_color"
android:textSize="@dimen/rc_font_auxiliary_size" />
</RelativeLayout>
</RelativeLayout>
<LinearLayout
android:id="@+id/rc_conversation_title_layout"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/rc_margin_size_12"
android:orientation="horizontal"
app:autoTextEllipsize="@+id/rc_conversation_title"
app:layout_constraintEnd_toStartOf="@+id/rc_conversation_date"
app:layout_constraintStart_toEndOf="@+id/rc_conversation_portrait_rl"
app:layout_constraintTop_toTopOf="parent">
<TextView
android:id="@+id/rc_conversation_title"
style="@style/TextStyle.Alignment"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/rc_margin_size_16"
android:ellipsize="end"
android:maxWidth="120dp"
android:maxLines="1"
android:textColor="@color/rc_text_main_color"
android:textSize="@dimen/rc_font_secondary_size"
app:layout_constrainedWidth="true"
app:layout_constraintHorizontal_bias="0"
app:layout_constraintHorizontal_chainStyle="packed"
app:layout_constraintStart_toEndOf="@+id/rc_conversation_portrait_rl"
app:layout_constraintTop_toTopOf="parent"
tools:text="张三11111111111111111111111" />
<TextView
android:id="@+id/rc_conversation_live_status"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="12dp"
android:layout_marginEnd="@dimen/rc_margin_size_12"
android:background="@drawable/bg_main_message_chat_list_live_timer"
android:paddingStart="5dp"
android:paddingTop="2dp"
android:paddingEnd="3dp"
android:paddingBottom="3dp"
android:singleLine="true"
android:textColor="#EC70FD"
android:textSize="10sp"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="@+id/rc_conversation_title"
app:layout_constraintStart_toEndOf="@+id/rc_conversation_title"
app:layout_constraintTop_toTopOf="parent"
tools:text="看直播10min"
tools:visibility="visible" />
<TextView
android:id="@+id/rc_conversation_status"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/rc_margin_size_12"
android:layout_marginTop="@dimen/rc_margin_size_16"
android:singleLine="true"
android:textSize="8sp"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="@+id/rc_conversation_title"
app:layout_constraintStart_toEndOf="@+id/rc_conversation_live_status"
app:layout_constraintTop_toTopOf="parent"
tools:text="在线" />
</LinearLayout>
<TextView
android:id="@+id/rc_conversation_content"
style="@style/TextStyle.Alignment"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="12dp"
android:layout_marginTop="4dp"
android:layout_marginEnd="60dp"
android:ellipsize="end"
android:maxLines="1"
android:text="你好朋友11111111111111111111111111111111111111111"
android:textColor="@color/rc_secondary_color"
android:textSize="@dimen/rc_font_text_third_size"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toEndOf="@+id/rc_conversation_portrait_rl"
app:layout_constraintTop_toBottomOf="@+id/rc_conversation_title_layout" />
<TextView
android:id="@+id/rc_conversation_date"
style="@style/TextStyle.Alignment"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/rc_margin_size_16"
android:text="3 月 22 日"
android:textColor="@color/rc_auxiliary_color"
android:textSize="@dimen/rc_font_nav_or_date_size"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<ImageView
android:id="@+id/rc_conversation_no_disturb"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/rc_margin_size_12"
android:layout_marginBottom="@dimen/rc_margin_size_12"
android:src="@drawable/rc_no_disturb"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
tools:visibility="visible" />
<ImageView
android:id="@+id/rc_conversation_read_receipt"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/rc_margin_size_2"
android:layout_marginBottom="@dimen/rc_margin_size_12"
android:src="@drawable/rc_read_receipt"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/rc_conversation_no_disturb"
app:layout_goneMarginRight="@dimen/rc_margin_size_12" />
<View
android:layout_width="wrap_content"
android:layout_height="0.5dp"
android:layout_marginTop="71.5dp"
android:background="@color/rc_divider_color"
app:layout_constraintStart_toStartOf="@id/rc_conversation_title_layout"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -2,7 +2,7 @@
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="280dp"
android:layout_height="440dp"
android:layout_height="350dp"
android:orientation="vertical"
app:cardCornerRadius="12dp"
app:cardElevation="16dp">
@@ -248,6 +248,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="29dp"
android:visibility="gone"
android:layout_marginTop="20dp"
android:layout_marginEnd="29dp"
android:gravity="center_vertical">

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.4 KiB

View File

@@ -1468,4 +1468,10 @@ Limited ride And limited avatar frame</string>
<string name="activity_msg_chat_top_status_online">Online</string>
<string name="activity_msg_chat_top_status_offline">Offline</string>
<string name="commen_user_active">Personal updates</string>
<string name="activity_msg_list_title_contacts">Contacts</string>
<string name="activity_msg_chat_list_card">[In-app sharing]</string>
<string name="activity_msg_list_include">Include:</string>
<string name="message_chat_msg_look_live">看直播%dmin</string>
<string name="activity_msg_list_title_chat_records">Chat Records</string>
</resources>

View File

@@ -1550,4 +1550,9 @@
<string name="pking_over">主播正在PK稍後再試</string>
<string name="guard_buy_tips_1">您將花費%s鑽石為主播開通</string>
<string name="prank_complete">完成*1</string>
<string name="activity_msg_list_title_contacts">聯繫人</string>
<string name="activity_msg_chat_list_card">[站内分享]</string>
<string name="activity_msg_list_include">包含:</string>
<string name="message_chat_msg_look_live">看直播%dmin</string>
<string name="activity_msg_list_title_chat_records">聊天記錄</string>
</resources>

View File

@@ -1550,4 +1550,9 @@
<string name="pking_over">主播正在PK稍後再試</string>
<string name="guard_buy_tips_1">您將花費%s鑽石為主播開通</string>
<string name="prank_complete">完成*1</string>
<string name="activity_msg_list_title_contacts">聯繫人</string>
<string name="activity_msg_chat_list_card">[站内分享]</string>
<string name="activity_msg_list_include">包含:</string>
<string name="message_chat_msg_look_live">看直播%dmin</string>
<string name="activity_msg_list_title_chat_records">聊天記錄</string>
</resources>

View File

@@ -1548,4 +1548,9 @@
<string name="pking_over">主播正在PK稍後再試</string>
<string name="guard_buy_tips_1">您將花費%s鑽石為主播開通</string>
<string name="prank_complete">完成*1</string>
<string name="activity_msg_list_title_contacts">聯繫人</string>
<string name="activity_msg_chat_list_card">[站内分享]</string>
<string name="activity_msg_list_include">包含:</string>
<string name="message_chat_msg_look_live">看直播%dmin</string>
<string name="activity_msg_list_title_chat_records">聊天記錄</string>
</resources>

View File

@@ -1572,4 +1572,9 @@ Limited ride And limited avatar frame</string>
<string name="main_type_theater" >Theater</string>
<string name="pking_over">The anchor is in PK, please try again later</string>
<string name="prank_complete">once</string>
<string name="activity_msg_list_title_contacts">Contacts</string>
<string name="activity_msg_chat_list_card">[In-app sharing]</string>
<string name="activity_msg_list_include">Include:</string>
<string name="message_chat_msg_look_live">看直播%dmin</string>
<string name="activity_msg_list_title_chat_records">Chat Records</string>
</resources>