按类型聚合会话
IMKit 支持在会话列表中按照会话类型进行聚合(折叠)。设置聚合显示的会话类型后,该类型的会话在会话列表中仅被展示为一个聚合条目。默认情况下,IMKit 的会话列表页面会以平铺方式展示所有本地会话。
下图展示了设置了单聊类型会话聚合显示的效果。在会话列表中,所有单聊会话折叠为“单聊消息”(左侧),点击后跳转到聚合会话列表(右侧)。
IMKit 在默认的聚合会话页面 Activity(RongSubConversationListActivity
)包含了标 题栏的实现。如果基于 Fragment 构建聚合会话列表页面,请自行实现标题栏。
局限
- 会话列表中的聚合会话项目不支持置顶操作。
设置聚合显示的会话类型
聚合会话功能支持单聊、群聊、系统会话类型。如需聚合显示,需要继承 BaseDataProcessor
实现自定义数据处理器,在打开会话列表页面之前提供给 IMKit。
-
声明自定义的数据处理器类
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;
}
}
} -
在打开会话列表页面之前,使用方法设置会话列表数据处理器。
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);
参数 | 类型 | 说明 |
---|---|---|
context | Context | activity 上下文 |
type | Conversation.ConversationType | 会话类型。 |
title | String | 会话列表页面标题。如果传空,会显示为默认标题 “会话列表”。 |
数据处理器通过抽象类 BaseDataProcessor
支持的版本为 5.1.3.x 系列中的稳定版,以及 5.1.5 及之后所有版本。其它版本需要使用 DataProcessor
接口自行实现一个 DataProcessor
类。关于数据处理器的详细说明,可参见自定义数据处理。
使用 Fragment 构建聚合会话列表 Activity
如果 IMKit 提供的默认聚合会话列表 RongSubConversationListActivity
不能满足需求,推荐继承使用 IMKit 提供的聚合会话列表 Fragment 类 SubConversationListFragment
构建自定义聚合会话列表页面。
App 自定义的聚合会话列表 Activity 必须注册到 IMKit SDK 中,以替换 IMKit 默认的聚合会话列表 Activity。
-
您可以在应用 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> -
实现聚合会话列表布局。此处以
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> -
继承 IMKit 的
SubConversationListFragment
创建子类,例如AppSubConversationListFragment
。在MyAggregateConversationListActivity
的onCreate
方法中创建并使用SubConversationListFragment
。SubConversationListFragment subconversationListFragment = new AppSubConversationListFragment();
FragmentManager manager = getSupportFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
transaction.replace(R.id.container, subconversationListFragment);
transaction.commit(); -
向
RouteUtils
注册自定义的聚合会话列表 Activity,以替换 IMKit 默认的聚合会话列表 Activity。方法在应用生命周期内、主进程中注册一次即可。RouteUtils.registerActivity(RouteUtils.RongActivityType.SubConversationListActivity, MyAggregateConversationListActivity.class);
参数 类型 说明 activityType RongActivityType IMKit 内置的 Activity 类型枚举,此处为 RongActivityType.SubConversationListActivity
className Class<? extends Activity>
应用自定义的聚合会话列表 Activity 的类名。 注册完成后,在 SDK 内部页面需要跳转到聚合会话列表场景时,SDK 会自动跳转到您注册的应用 Activity。
定制化
设置会话按类型聚合后,会话列表页面会展示对应的聚合会话(GatheredConversation
)条目。您可以为聚合会话设置头像与昵称(标题)。
设置聚合会话头像
您可以为会话列表页面中的聚合会话(GatheredConversation
)设置自定义头像。默认使用融云默认头像。
RongConfigCenter.gatheredConversationConfig().setGatherConversationPortrait(conversationType, portraitUri);
参数 | 类型 | 说明 |
---|---|---|
conversationType | ConversationType | 聚合显示的会话类型 |
portraitUri | Uri | 自定义的聚合会话的头像资源 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);
参数 | 类型 | 说明 |
---|---|---|
conversationType | ConversationType | 聚合显示的会话类型 |
title | String | 自定义的聚合会话标题 |
如果使用 IMKit 在默认的聚合会话页面 Activity(RongSubConversationListActivity
),聚合会话的标题也会显示在页面标题栏中。