会话消息界面事件监听
更新时间: 2024/09/27 10:50:00
IM UIKit 会话列表模块(ChatKit-ui
)提供会话列表监听器IMessageItemClickListener
监听会话消息界面中的点击事件,帮助您快速实现相应的点击逻辑。您也可通过改动源码的的方式设置事件监听。
通过监听器监听
监听器说明
创建IMessageItemClickListener
时可调用其内置方法,分别监听消息的点击事件、长按事件和头像点击等。
- 方法说明
方法名称 |
方法说明 | 参数说明 |
---|---|---|
onMessageClick |
会话中消息的点击事件 | onMessageClick 的参数如下
|
onMessageLongClick |
会话消息的长按事件 | onMessageLongClick 的参数说明如下
|
onUserIconClick |
会话消息的头像点击事件 | onUserIconClick 的参数说明如下
|
onSelfIconClick |
会话消息的头像点击事件 | onSelfIconClick 的参数说明如下
|
onUserIconLongClick |
会话消息的头像长按事件 | onUserIconLongClick 的参数说明如下
|
onReplyMessageClick |
会话中回复消息的点击事件 | onReplyMessageClick 的参数说明如下
|
onReEditRevokeMessage |
会话中已撤回消息的编辑点击事件 | onReEditRevokeMessage 的参数说明如下
|
onSendFailBtnClick |
会话消息发送失败图标点击事件 | onSendFailBtnClick 的参数说明如下
|
下图中红框所示的单个消息区域即为一个消息 Item。
- ChatMessageBean 说明
ChatMessageBean
为会话消息数据实体类,其成员参数见下表。
属性或方法 | 类型 | 说明 |
---|---|---|
haveRead |
boolean | 标记消息是否为已读 |
messageData |
IMMessageInfo | 消息实体类,消息内容 |
isSameMessage() |
boolean | 判断是否为同一条消息 |
示例代码
java//1、实现点击事件
ChatUIConfig config = new ChatUIConfig();
config.messageItemClickListener = new IMessageItemClickListener() {
@Override
public boolean onMessageLongClick(View view, ChatMessageBean messageInfo) {
...
}
@Override
public void onUserIconClick(View view, ChatMessageBean messageInfo) {
...
}
@Override
public void onSelfIconClick(View view) {
...
}
...
};
//2、将自定义事件设置到ChatKitClient即可
ChatKitClient.setChatUIConfig(config);
通过源码改动实现监听
会话列表的实现逻辑都包含在ChatBaseFragment
中,如果需要修改消息体的点击事件和长按事件的监听等,可以对itemClickListener
实例的源码进行修改。
java private final IMessageItemClickListener itemClickListener = new IMessageItemClickListener() {
@Override
public boolean onMessageLongClick(View view, ChatMessageBean messageBean) {
if (messageBean.isRevoked()) {
return false;
}
//展示长按菜单,具体代码参考源码
...
return true;
}
@Override
public void onMessageClick(View view, int position, ChatMessageBean messageBean) {
//消息点击事件实现
if (messageBean.getViewType() == MsgTypeEnum.image.getValue()) {
//图片消息,打开图片
watchImage(messageBean,
binding.chatView.getMessageListView().filterMessagesByType(messageBean.getViewType()));
} else if (messageBean.getViewType() == MsgTypeEnum.video.getValue()) {
//视频消息,播放视频
watchVideo(messageBean.getMessageData().getMessage());
}
}
@Override
public void onUserIconClick(View view, ChatMessageBean messageBean) {
//跳转到用户信息页面
XKitRouter.withKey(RouterConstant.PATH_USER_INFO_PAGE)
.withContext(view.getContext())
.withParam(RouterConstant.KEY_ACCOUNT_ID_KEY,
messageBean.getMessageData().getMessage().getFromAccount())
.navigate();
}
@Override
public void onSelfIconClick(View view) {
//跳转到个人信息页面
XKitRouter.withKey(RouterConstant.PATH_MINE_INFO_PAGE)
.withContext(view.getContext())
.navigate();
}
@Override
public void onUserIconLongClick(View view, ChatMessageBean messageBean) {
//暂无实现
}
@Override
public void onReEditRevokeMessage(View view, ChatMessageBean messageBean) {
//点击撤回消息的编辑,只支持文本消息
if (messageBean.getMessageData().getMessage().getMsgType() == MsgTypeEnum.text) {
binding.chatView.getInputView()
.setReEditMessage(messageBean.getMessageData().getMessage().getContent());
}
}
@Override
public void onReplyMessageClick(View view, String messageUuid) {
//点击回复消息,默认实现为滚动到被回复消息位置
binding.chatView.getMessageListView().scrollToMessage(messageUuid);
}
@Override
public void onSendFailBtnClick(View view, ChatMessageBean messageBean) {
//发送失败图标点击,该实现为重新发送消息
IMessageItemClickListener.super.onSendFailBtnClick(view, messageBean);
viewModel.sendMessage(messageBean.getMessageData().getMessage(), true, true);
}
};
此文档是否对你有帮助?