跳到主要内容

按类型聚合会话

IMKit SDK 支持在会话列表中按照会话类型进行聚合(折叠)。设置聚合显示后,该类型的会话在会话列表中仅被展示为一个聚合条目。默认情况下会话列表页面会以平铺方式展示所有本地会话。

下图展示了设置了单聊类型会话聚合显示的效果。在会话列表中,所有单聊会话折叠为单聊消息(左侧),点击后跳转到聚合会话列表(右侧)。

提示

IMKit SDK 在默认的聚合会话页面 Activity(RongSubConversationListActivity)包含了标题栏的实现。如果基于 Fragment 构建聚合会话列表页面,请自行实现标题栏。

(width=250) (width=250)

局限​

  • 会话列表中的聚合会话项目不支持置顶操作。
  • 仅支持按照会话类型聚合,不支持根据会话 Id 进行聚合。

设置聚合显示的会话类型​

聚合会话功能支持单聊、群聊、系统会话类型。可继承 BaseDataProcessor 实现自定义数据处理器,在打开会话列表页面之前提供给 IMKit。

  1. 声明自定义的数据处理器类 MyAggregateDataProcessor,继承 SDK 的数据处理器 BaseDataProcessor。重写 isGathered 的方法,。当会话类型为需要聚合显示的会话类型时,返回 true。下例中我们聚合显示所有系统会话。

    Java
    public class MyAggregateDataProcessor extends BaseDataProcessor<Conversation> {
    /**
    * 自定义会话列表页面支持的会话类型,此处设置为支持单聊、群组和系统会话。
    */
    @Override
    public Conversation.ConversationType[] supportedTypes() {
    Conversation.ConversationType[] types = {Conversation.ConversationType.PRIVATE, Conversation.ConversationType.GROUP, Conversation.ConversationType.SYSTEM};
    return types;
    }

    /**
    * 自定义需要聚合显示的会话。此处设置单聊会话聚合显示。
    */
    @Override
    public boolean isGathered(Conversation.ConversationType type) {
    if (type.equals(Conversation.ConversationType.PRIVATE)) {
    return true;
    } else {
    return false;
    }
    }

    }
  2. 在打开会话列表页面之前,使用 setDataProcessor 方法设置会话列表数据处理器。

    Java
    RongConfigCenter.conversationListConfig().setDataProcessor(new MyAggregateDataProcessor());

聚合会话列表页面​

设置会话聚合后,在会话列表页面中,被聚合会话会被折叠为一个聚合会话条目(GatheredConversation)。点击该条目后,SDK 会跳转到聚合会话列表页面。

IMKit 提供基于 Activity 类和基于 Fragment 类实现的聚合会话列表页面。

  • 基于 Activity:IMKit 提供了默认的聚合会话列表页面 RongSubConversationListActivity。页面展示一个标题栏和一个聚合会话列表。在 SDK 内部页面需要跳转到聚合会话列表时,默认会跳转到该 Activity。
  • 基于 Fragment:您可以使用 IMKit 的 SubConversationListFragment 构建自定义聚合会话列表页面。注意,您需要将自定义会话列表 Activity 注册到 IMKit SDK 中,以替换 IMKit 默认的聚合会话列表 Activity。

启动默认聚合会话列表页面​

如果您需要在 App 的其它页面跳转到聚合会话列表 Activity,可以使用 IMKit 内置的 Activity 路由器 RouteUtils。

提示

如果您构建了自定义的会话列表 Activity,必须先向 RouteUtils 注册自定义 Activity,才能通过这种方式跳转到自定义会话列表 Activity,否则跳转的是 SDK 默认的 RongSubConversationListActivity。

参数说明​

参数类型说明
contextContextactivity 上下文
typeConversation.ConversationType会话类型。
titleString会话列表页面标题。如果传空,会显示为默认标题 “会话列表”。

示例代码​

Java
RouteUtils.routeToSubConversationListActivity(context, conversationType, title);
提示

数据处理器通过抽象类 BaseDataProcessor 支持的版本为 5.1.3.x 系列中的稳定版,以及 5.1.5 及之后所有版本。其它版本需要使用 DataProcessor 接口自行实现一个 DataProcessor 类。关于数据处理器的详细说明,可参见自定义数据处理。

使用 Fragment 构建聚合会话列表 Activity​

如果 IMKit 提供的默认聚合会话列表 RongSubConversationListActivity 不能满足需求,推荐继承使用 IMKit 提供的聚合会话列表 Fragment 类 SubConversationListFragment 构建自定义聚合会话列表页面。

提示

App 自定义的聚合会话列表 Activity 必须注册到 IMKit SDK 中,以替换 IMKit 默认的聚合会话列表 Activity。

  1. 您可以在应用 Activity 中集成 IMKit 提供的聚合会话列表 Fragment。以下示例声明一个新的MyAggregateConversationListActivity。

    xml
    <activity
    android:name="xxx.xxx.MyAggregateConversationListActivity"
    android:screenOrientation="portrait"
    android:windowSoftInputMode="stateHidden|adjustResize">
    <intent-filter>
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.DEFAULT" />
    <data
    android:host="${applicationId}"
    android:pathPrefix="/subconversationlist"
    android:scheme="rong" />
    </intent-filter>
    </activity>
  2. 实现聚合会话列表布局。此处以 activity_subconversation_list.xml 布局为例。

    xml
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <FrameLayout
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />
    </LinearLayout>
  3. 继承 IMKit 的 SubConversationListFragment 创建子类,例如 AppSubConversationListFragment。在 MyAggregateConversationListActivity 的 onCreate 方法中创建并使用 SubConversationListFragment。

    Java
    SubConversationListFragment subconversationListFragment = new AppSubConversationListFragment();
    FragmentManager manager = getSupportFragmentManager();
    FragmentTransaction transaction = manager.beginTransaction();
    transaction.replace(R.id.container, subconversationListFragment);
    transaction.commit();
  4. 向 RouteUtils 注册自定义的聚合会话列表 Activity,以替换 IMKit 默认的聚合会话列表 Activity。方法在应用生命周期内、主进程中注册一次即可。

    参数说明​

    参数类型说明
    activityTypeRongActivityTypeIMKit 内置的 Activity 类型枚举,此处为 RongActivityType.SubConversationListActivity
    classNameClass<? extends Activity>应用自定义的聚合会话列表 Activity 的类名。

    示例代码​

    Java
    RouteUtils.registerActivity(RouteUtils.RongActivityType.SubConversationListActivity, MyAggregateConversationListActivity.class);

    注册完成后,在 SDK 内部页面需要跳转到聚合会话列表场景时,SDK 会自动跳转到您注册的应用 Activity。

定制化​

设置会话按类型聚合后,会话列表页面会展示对应的聚合会话(GatheredConversation)条目。您可以为聚合会话设置头像与昵称(标题)。

设置聚合会话头像​

您可以为会话列表页面中的聚合会话(GatheredConversation)设置自定义头像。默认使用融云默认头像。

参数说明​

参数类型说明
conversationTypeConversationType聚合显示的会话类型
portraitUriUri自定义的聚合会话的头像资源 uri

示例代码​

Java
RongConfigCenter.gatheredConversationConfig().setGatherConversationPortrait(conversationType, portraitUri);

设置聚合会话的标题​

您可以为在会话列表页面中的聚合会话(GatheredConversation)设置自定义标题。如未设置,使用融云默认标题规则。默认标题与会话类型相关,下表列出了各会话类型的聚合显示条目的标题字符串:

聚合会话类型会话标题资源名称
单聊”单聊消息“R.string.rc_gathered_conversation_private_title
群聊”群聊消息“R.string.rc_gathered_conversation_group_title
系统”系统消息“R.string.rc_gathered_conversation_system_title

如果需要更改聚合会话标题,可以在进入会话列表之前,调用下面方法配置:

参数说明​

参数类型说明
conversationTypeConversationType聚合显示的会话类型
titleString自定义的聚合会话标题

示例代码​

Java
RongConfigCenter.gatheredConversationConfig().setConversationTitle(conversationType, title);

如果使用 IMKit 在默认的聚合会话页面 Activity(RongSubConversationListActivity),聚合会话的标题也会显示在页面标题栏中。