一、前言
社交软件,在聊天中送礼物很常见吧。相亲交友类,更是必备。
二、效果图

三、解决思路
仔细看效果图,这比普通的自定义消息要复杂些,它没有显示发送方的头像,发送方和接收方看到的礼物消息都是在中间。通过“送出礼物”和“收到礼物”的文案来区分是谁发送的。
不用头像,显示在中间做下如下配置:
init {
mConfig.showPortrait = false
mConfig.centerInHorizontal = true
}
判断谁发送的,可以在消息体里面定义个用户id
viewHolder.setText(R.id.tv_gift_status,if (customizeGiftsMessage.sendUserId == SPUtil.getUserId()){
viewHolder.context.getString(R.string.send_gift)
} else {
viewHolder.context.getString(R.string.receive_gift)
})
四、给下消息体和Provider参考(正常你们业务没这么复杂的)
CustomizeGiftsMessage
@MessageTag(value = "customize_gift_message", flag = MessageTag.ISPERSISTED | MessageTag.ISCOUNTED)
public class CustomizeGiftsMessage extends MessageContent {
private String giftImg;
private String giftTip;
private String giftName;
private int giftNum;
private int giftType = 0;
private int sendUserId ; //发送者的用户id,不是融云的id
//系统心动礼物
public static int SYSTEM_LOVE_GIFT_TYPE = 1;
//普通礼物
public static int NORMAL_GIFT_TYPE = 0;
//普通的心动礼物
public static int NORMAL_LOVE_GIFT_TYPE = 2;
private String msgUid = ""; //自己app服务器建的,不是融云的消息的uid
public CustomizeGiftsMessage(String giftImg,String giftName,String giftTip,int giftNum,int giftType,int sendUserId){
this.giftImg = giftImg;
this.giftName = giftName;
this.giftNum = giftNum;
this.giftType = giftType;
this.sendUserId = sendUserId;
this.giftTip = giftTip;
}
public String getGiftImg() {
return giftImg;
}
public void setGiftImg(String giftImg) {
this.giftImg = giftImg;
}
public String getGiftName() {
return giftName;
}
public void setGiftName(String giftName) {
this.giftName = giftName;
}
public int getGiftNum() {
return giftNum;
}
public void setGiftNum(int giftNum) {
this.giftNum = giftNum;
}
public int getGiftType() {
return giftType;
}
public void setGiftType(int giftType) {
this.giftType = giftType;
}
public int getSendUserId() {
return sendUserId;
}
public void setSendUserId(int sendUserId) {
this.sendUserId = sendUserId;
}
public String getGiftTip() {
return giftTip;
}
public void setGiftTip(String giftTip) {
this.giftTip = giftTip;
}
public String getMsgUid() {
return msgUid;
}
public void setMsgUid(String msgUid) {
this.msgUid = msgUid;
}
@Override
public byte[] encode() {
JSONObject jsonObject = new JSONObject();
try {
jsonObject.put("giftImg",getGiftImg());
jsonObject.put("giftName",getGiftName());
jsonObject.put("giftTip",getGiftTip());
jsonObject.put("giftNum",getGiftNum());
jsonObject.put("giftType",getGiftType());
jsonObject.put("sendUserId",getSendUserId());
jsonObject.put("msgUid",getMsgUid());
} catch (JSONException e) {
e.printStackTrace();
}
try{
return jsonObject.toString().getBytes("UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return null;
}
public CustomizeGiftsMessage(byte [] data){
String str = null ;
try{
str = new String(data,"UTF-8") ;
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
try{
JSONObject json = new JSONObject(str);
if(json.has("giftImg")){
giftImg = json.optString("giftImg");
}
if(json.has("giftName")){
giftName = json.optString("giftName");
}
if(json.has("giftTip")){
giftTip = json.optString("giftTip");
}
if(json.has("giftNum")){
giftNum = json.optInt("giftNum");
}
if(json.has("giftType")){
giftType = json.optInt("giftType");
}
if(json.has("sendUserId")){
sendUserId = json.optInt("sendUserId");
}
if(json.has("msgUid")){
msgUid = json.optString("msgUid");
}
} catch (JSONException e) {
e.printStackTrace();
}
}
public CustomizeGiftsMessage(Parcel in){
this.giftImg = ParcelUtils.readFromParcel(in);
this.giftName = ParcelUtils.readFromParcel(in);
this.giftTip = ParcelUtils.readFromParcel(in);
this.giftNum = ParcelUtils.readIntFromParcel(in);
this.giftType = ParcelUtils.readIntFromParcel(in);
this.sendUserId = ParcelUtils.readIntFromParcel(in);
this.msgUid = ParcelUtils.readFromParcel(in);
}
public static final Creator<CustomizeGiftsMessage> CREATOR = new Creator<CustomizeGiftsMessage>() {
@Override
public CustomizeGiftsMessage createFromParcel(Parcel parcel) {
return new CustomizeGiftsMessage(parcel);
}
@Override
public CustomizeGiftsMessage[] newArray(int i) {
return new CustomizeGiftsMessage[i];
}
};
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel parcel, int i) {
ParcelUtils.writeToParcel(parcel,giftImg);
ParcelUtils.writeToParcel(parcel,giftName);
ParcelUtils.writeToParcel(parcel,giftTip);
ParcelUtils.writeToParcel(parcel,giftNum);
ParcelUtils.writeToParcel(parcel,giftType);
ParcelUtils.writeToParcel(parcel,sendUserId);
ParcelUtils.writeToParcel(parcel,msgUid);
}}
CustomizeGiftsMessageProvider
class CustomizeGiftsMessageProvider: BaseMessageItemProvider<CustomizeGiftsMessage>() {
init {
mConfig.showPortrait = false
mConfig.centerInHorizontal = true
}
companion object{
//2022年5月6日10:16:14改为用SP存,这样第二次打开app看到和上次一样,而不是变为了“发出心动礼物”
//确认被收下的心动礼物,用于处理外面列表的显示,外面列表刷新就会重新走getSummarySpannable
//expireUidList,noReceivedGiftUidList记录的是上次点进去会话的列表,单纯依靠它判断就会有重复问题
//var sureReceivedGiftUidList:MutableList<String> = mutableListOf()
//确认被退回的心动礼物
//var sureBackGiftUidList:MutableList<String> = mutableListOf()
}
override fun getSummarySpannable(context: Context, p1: CustomizeGiftsMessage): Spannable {
if (p1.sendUserId == SPUtil.getUserId()){
//发送方外面显示什么
return if (p1.giftType == CustomizeGiftsMessage.SYSTEM_LOVE_GIFT_TYPE ){
//系统心动礼物,也可能是匹配礼物
var outContentStr = p1.giftTip
if (p1.giftTip == context.getString(R.string.send_love_gift)){
if (!SPUtil.getList<String>("sureBackGiftUidList").isNullOrEmpty() && SPUtil.getList<String>("sureBackGiftUidList").contains(p1.msgUid)){
outContentStr = context.getString(R.string.love_gift_return_back)
} else {
if (!SPUtil.getList<String>("sureReceivedGiftUidList").isNullOrEmpty() && SPUtil.getList<String>("sureReceivedGiftUidList").contains(p1.msgUid)){
outContentStr = context.getString(R.string.send_love_gift_received)
}
}
}
SpannableString(outContentStr)
} else if (p1.giftType ==CustomizeGiftsMessage.NORMAL_LOVE_GIFT_TYPE) {
SpannableString(context.getString(R.string.send_love_gift_received))
} else{
SpannableString(String.format(context.getString(R.string.gift_send_three_tip),p1.giftName,p1.giftNum))
}
} else {
return if (p1.giftType == CustomizeGiftsMessage.SYSTEM_LOVE_GIFT_TYPE ){
//心动礼物
SpannableString(context.getString(R.string.gift_send_four_tip))
} else if (p1.giftType ==CustomizeGiftsMessage.NORMAL_LOVE_GIFT_TYPE){
SpannableString(context.getString(R.string.gift_send_four_tip_2))
} else{
SpannableString(String.format(context.getString(R.string.gift_send_five_tip),p1.giftName,p1.giftNum))
}
}
}
override fun onCreateMessageContentViewHolder(parent: ViewGroup, p1: Int): ViewHolder {
val rootView: View =
LayoutInflater.from(parent.context).inflate(R.layout.rc_my_gift_item, parent, false)
ShapeUtils.setShapeCorner2Color(
rootView,
parent.context.resources.getColor(R.color.white),
dp2px(parent.context, 6).toFloat()
)
return ViewHolder(parent.context,rootView)
}
override fun bindMessageContentViewHolder(
viewHolder: ViewHolder,
parentHolder: ViewHolder,
customizeGiftsMessage: CustomizeGiftsMessage,
p3: UiMessage?,
p4: Int,
p5: MutableList<UiMessage>?,
p6: IViewProviderListener<UiMessage>?
) {
//Log.i("giftImg",customizeGiftsMessage.giftImg)
LogUtils.i("SummarySpannable3","SummarySpannable3")
ImageLoader.loadCover(viewHolder.getView(R.id.iv_gift),customizeGiftsMessage.giftImg)
viewHolder.setText(R.id.tv_gift_name,"【${customizeGiftsMessage.giftName}】x${customizeGiftsMessage.giftNum}")
viewHolder.setTextColor(R.id.tv_gift_status,viewHolder.context.getColors(R.color.black))
viewHolder.getView<TextView>(R.id.tv_gift_status).setCompoundDrawablesWithIntrinsicBounds(null,null,null,null)
when (customizeGiftsMessage.giftType) {
CustomizeGiftsMessage.NORMAL_GIFT_TYPE -> {
viewHolder.setText(R.id.tv_gift_status,if (customizeGiftsMessage.sendUserId == SPUtil.getUserId()){
viewHolder.context.getString(R.string.send_gift)
} else {
viewHolder.context.getString(R.string.receive_gift)
})
}
CustomizeGiftsMessage.NORMAL_LOVE_GIFT_TYPE -> {
if (customizeGiftsMessage.sendUserId == SPUtil.getUserId()){
viewHolder.setText(R.id.tv_gift_status,viewHolder.context.getString(R.string.send_love_gift_received))
viewHolder.getView<TextView>(R.id.tv_gift_status).setCompoundDrawablesWithIntrinsicBounds(null,null,viewHolder.context.getDrawables(R.mipmap.ic_gift_received_tag),null)
} else {
viewHolder.setText(R.id.tv_gift_status,viewHolder.context.getString(R.string.receive_love_gift))
}
}
CustomizeGiftsMessage.SYSTEM_LOVE_GIFT_TYPE -> {
if (customizeGiftsMessage.giftTip == viewHolder.context.getString(R.string.send_love_gift)){
if (!expireUidList.isNullOrEmpty() && expireUidList!!.contains(customizeGiftsMessage.msgUid)){
viewHolder.setText(R.id.tv_gift_status,viewHolder.context.getString(R.string.love_gift_return_back))
viewHolder.setTextColor(R.id.tv_gift_status,viewHolder.context.getColors(R.color.color_AEAEB2))
val sureBackGiftUidList = if (SPUtil.getList<String>("sureBackGiftUidList").isNullOrEmpty()){
mutableListOf<String>()
} else {
SPUtil.getList<String>("sureBackGiftUidList")
}
sureBackGiftUidList.add(customizeGiftsMessage.msgUid)
SPUtil.putList("sureBackGiftUidList",sureBackGiftUidList)
} else {
if (!unreceivedGiftUidList.isNullOrEmpty() && unreceivedGiftUidList!!.contains(customizeGiftsMessage.msgUid)){
viewHolder.setText(R.id.tv_gift_status,customizeGiftsMessage.giftTip)
} else {
viewHolder.setText(R.id.tv_gift_status,viewHolder.context.getString(R.string.send_love_gift_received))
viewHolder.getView<TextView>(R.id.tv_gift_status).setCompoundDrawablesWithIntrinsicBounds(null,null,viewHolder.context.getDrawables(R.mipmap.ic_gift_received_tag),null)
val sureReceivedGiftUidList = if (SPUtil.getList<String>("sureReceivedGiftUidList").isNullOrEmpty()){
mutableListOf<String>()
} else {
SPUtil.getList<String>("sureReceivedGiftUidList")
}
sureReceivedGiftUidList.add(customizeGiftsMessage.msgUid)
SPUtil.putList("sureReceivedGiftUidList",sureReceivedGiftUidList)
}
}
} else {
viewHolder.setText(R.id.tv_gift_status,customizeGiftsMessage.giftTip)
}
}
else -> {
viewHolder.setText(R.id.tv_gift_status,viewHolder.context.getString(R.string.gift))
}
}
}
override fun onItemClick(
p0: ViewHolder?,
p1: CustomizeGiftsMessage?,
p2: UiMessage?,
p3: Int,
p4: MutableList<UiMessage>?,
p5: IViewProviderListener<UiMessage>?
): Boolean {
return true
}
override fun isMessageViewType(p0: MessageContent): Boolean {
return p0 is CustomizeGiftsMessage
}}
记得别忘了注册自定义消息和模板。
如果融云自定义消息方面有问题的,都可以私信我
网友评论