会话列表界面事件监听

更新时间: 2024/06/03 09:53:09

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();
        });
    }
此文档是否对你有帮助?
有帮助
去反馈
  • 通过监听器监听
  • 监听器说明
  • 示例代码
  • 通过源码改动实现监听