会话列表界面事件监听

更新时间: 2024/03/15 18:26:20

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为会话数据实体类,其成员参数见下表。

参数
类型
说明
viewType int View 类型,在会话列表中有两种类型分别是
  • ConversationConstant.ViewType.CHAT_VIEW:单聊的 View
  • ConversationConstant.ViewType.TEAM_VIEW:群聊的 View
router String 会话的跳转路由地址,默认实现中会拼装该数据
  • RouterConstant.PATH_CHAT_P2P_PAGE:单聊会话的跳转路由地址
  • RouterConstant.PATH_CHAT_TEAM_PAGE:群聊会话的跳转路由地址
paramKey String 需要传递参数的 Key 值,参数以 Map 的形式传递。在会话列表中,该值为RouterConstant.CHAT_KRY
param Object 需要传递参数的 value 值,参数以 Map 的形式传递。在会话列表中,
  • 如会话为单聊类型,则该值为UserInfo(用户信息)
  • 如为群聊类型,则该值为Team(群组信息)

示例代码

通过监听器实现界面点击事件监听的示例代码如下:

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();
        });
    }

此文档是否对你有帮助?
有帮助
去反馈
  • 通过监听器监听
  • 监听器说明
  • 示例代码
  • 通过源码改动实现监听