跳到主要内容

按类型聚合会话

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

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

提示

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

(width=250) (width=250)

局限

  • 会话列表中的聚合会话项目不支持置顶操作。

设置聚合显示的会话类型

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

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

    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. 在打开会话列表页面之前,使用方法设置会话列表数据处理器。

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

聚合会话列表页面

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

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

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

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

IMKit SDK 默认提供的聚合会话列表页面 Activity。点击聚合会话时,默认跳转到以下聚合会话列表 RongSubConversationListActivity

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

提示

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

RouteUtils.routeToSubConversationListActivity(context, conversationType, title);
参数类型说明
contextContextactivity 上下文
typeConversation.ConversationType会话类型。
titleString会话列表页面标题。如果传空,会显示为默认标题 “会话列表”。
提示

数据处理器通过抽象类 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

    <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 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。在 MyAggregateConversationListActivityonCreate 方法中创建并使用 SubConversationListFragment

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

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

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

定制化

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

设置聚合会话头像

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

RongConfigCenter.gatheredConversationConfig().setGatherConversationPortrait(conversationType, portraitUri);
参数类型说明
conversationTypeConversationType聚合显示的会话类型
portraitUriUri自定义的聚合会话的头像资源 uri

设置聚合会话的标题

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

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

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

RongConfigCenter.gatheredConversationConfig().setConversationTitle(conversationType, title);
参数类型说明
conversationTypeConversationType聚合显示的会话类型
titleString自定义的聚合会话标题

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