会话列表界面事件监听
更新时间: 2024/09/27 10:50:00
IM UIKit 会话列表模块(convesationkit-ui
)提供会话列表监听器 ItemClickListener
监听会话列表界面的单击事件和长按事件,帮助您快速实现相应的跳转逻辑。您也可通过改动源码的的方式,设置事件监听。
通过监听器监听
监听器说明
创建 ItemClickListener
时可调用其内置方法,分别监听单击事件和长按事件。
如果需要对监听器做自定义开发,可按需选择监听器的内置方法进行重写,自行实现界面跳转逻辑。不需要全部重写的内置方法,IM UIKit 会在执行它们默认的实现逻辑的基础上执行您自行实现的逻辑。例如,假设您在 IM UIKit 默认界面跳转逻辑的基础上实现了跳转前的数据埋点,那么 IM UIKit 将既执行您的数据埋点逻辑,也执行其自身的默认跳转逻辑。全部重写的内置方法,如果按照您的自定义逻辑返回 true
,那么 IM UIKit 将不再执行这些内置方法中默认实现的界面逻辑,返回 false
则既执行您的自定义逻辑,也执行默认实现的逻辑。
-
方法说明
方法名称方法说明 参数说明 onClick
监听会话列表和会话项 的单击事件
- 返回
true
代表不再执行 IM UIKit 默认实现的界面逻辑 - 返回
false
代表仍执行 IM UIKit 默认实现的界面逻辑
onClick
的参数如下- context`:会话列表上下文 |
ConversationBean
:会话项 数据,具体见下文的 ConversationBean 说明position
:被单击的会话在列表中的位置
onLongClick
监听会话列表和会话项 的长按事件
- 返回
true
代表不再执行 IM UIKit 默认实现的界面逻辑 - 返回
false
代表仍执行 IM UIKit 默认实现的界面逻辑
onLongClick
的参数说明如下context
:会话列表上下文ConversationBean
:会话项 数据,具体见下文的 ConversationBean 说明position
:被单击的会话在列表中的位置
onAvatarClick
监听会话列表和会话项中头像 的单击事件
- 返回
true
代表不再执行 IM UIKit 默认实现的界面逻辑 - 返回
false
代表仍执行 IM UIKit 默认实现的界面逻辑
onAvatarClick
的参数说明如下context
:会话列表上下文ConversationBean
:会话项 数据,具体见下文的 ConversationBean 说明position
:被单击的会话在列表中的位置
onAvatarLongClick
监听会话列表和会话项中头像 的长按事件
- 返回
true
代表不再执行 IM UIKit 默认实现的界面逻辑 - 返回
false
代表仍执行 IM UIKit 默认实现的界面逻辑
onAvatarLongClick
的参数说明如下context
:会话列表上下文ConversationBean
:会话项 数据,具体见下文的 ConversationBean 说明position
:被单击的会话在列表中的位置
下图中红框所示的单个会话界面区域即为一个 会话项。
- 返回
-
ConversationBean 说明
ConversationBean
为会话数据实体类,其成员参数见下表。参数类型说明 infoData
V2NIMConversation 会话信息 stickTop
Boolean 是否置顶 targetId
String 会话 ID
示例代码
通过监听器实现界面单击事件监听的示例代码如下:
java//1、实现单击事件
ConversationUIConfig config = new ConversationUIConfig();
config.itemClickListener = new ItemClickListener() {
@Override
public boolean onClick(Context context, ConversationBean data, int position) {
//可以参考默认实现,默认实现是跳转到聊天页面
//XKitRouter.withKey(data.router).withParam(data.paramKey, data.param).withContext(context).navigate();
return true;
}
@Override
public boolean onLongClick(Context context, ConversationBean data, int position) {
//添加您的代码逻辑,如果需要继续执行默认逻辑则返回 false,否则返回 true
return true;
}
};
//2、将自定义事件设置到 ConversationKitClient 即可
ConversationKitClient.setConversationUIConfig(config);
通过源码改动实现监听
会话列表的实现逻辑都包含在 ConversationFragment
中,如果需要修改单击事件和长按事件的监听,可以对 initView()
方法的源码进行修改。
java private void initView() {
//设置会话排序 Comparator,默认按照置顶和时间优先级进行排序
viewBinding.conversationView.setComparator(conversationComparator);
viewBinding.conversationView.setItemClickListener(new ViewHolderClickListener() {
@Override
public boolean onClick(BaseBean data, int position) {
//会话列表 Item 单击事件的实现,优先调用 ConversationUIConfig,为空则采用默认实现
if (ConversationKitClient.getConversationUIConfig() != null &&
ConversationKitClient.getConversationUIConfig().itemClickListener != null
&& data instanceof ConversationBean) {
ConversationKitClient.getConversationUIConfig().itemClickListener.onClick(ConversationFragment.this.getContext(), (ConversationBean) data, position);
} else {
XKitRouter.withKey(data.router).withParam(data.paramKey, data.param).withContext(ConversationFragment.this.getContext()).navigate();
}
return true;
}
@Override
public boolean onLongClick(BaseBean data, int position) {
//会话列表 Item 长按事件的实现,优先调用 ConversationUIConfig,为空则采用默认实现
if (ConversationKitClient.getConversationUIConfig() != null &&
ConversationKitClient.getConversationUIConfig().itemClickListener != null
&& data instanceof ConversationBean) {
return ConversationKitClient.getConversationUIConfig().itemClickListener.onLongClick(ConversationFragment.this.getContext(), (ConversationBean) data, position);
} else {
showStickDialog(data);
return true;
}
}
});
// TitleBar 右侧加号单击事件
viewBinding.conversationTitleBar.setRightImageClick(v -> {
if (ConversationKitClient.getConversationUIConfig() != null
&& ConversationKitClient.getConversationUIConfig().titleBarRightClick != null){
ConversationKitClient.getConversationUIConfig().titleBarRightClick.onClick(v);
return;
}
Context context = getContext();
ContentListPopView contentListPopView = new ContentListPopView.Builder(context)
.addItem(PopItemFactory.getAddFriendItem(context))
.addItem(PopItemFactory.getCreateGroupTeamItem(context))
.addItem(PopItemFactory.getCreateAdvancedTeamItem(context))
.build();
contentListPopView.showAsDropDown(v, ScreenUtil.dip2px(-105), 0);
});
// TitleBar 右侧第二个加号单击事件
viewBinding.conversationTitleBar.setRight2ImageClick(v -> {
if (ConversationKitClient.getConversationUIConfig() != null
&& ConversationKitClient.getConversationUIConfig().titleBarRight2Click != null){
ConversationKitClient.getConversationUIConfig().titleBarRight2Click.onClick(v);
return;
}
XKitRouter.withKey(RouterConstant.PATH_GLOBAL_SEARCH_PAGE).withContext(getContext()).navigate();
});
}