会话列表页面
会话列表页面展示当前设备上的所有会话。本地消息数据库生成消息后自动创建会话列表,并按时间倒序排列,置顶会话优先显示。
IMKit 提供基于 Activity 类和基于 Fragment 类 实现的会话列表页面。
- 基于 Activity:IMKit SDK 默认提供会话列表 Activity,包含标题栏和会话列表视图。当 SDK 内部需要跳转至会话列表时,默认使用该 Activity。
- 基于 Fragment:您可以在自定义 Activity 中集成 IMKit 提供的会话列表 Fragment,实现个性化界面。注意:需将该 Activity 注册至 IMKit SDK,以覆盖默认会话列表 Activity。
会话列表界面
会话列表页面一般由标题栏和会话列表两部分组成。
IMKit 默认提供的 RongConversationListActivity 已内置标题栏实现。若基于 Fragment 构建会话列表页面,需自行实现标题栏功能。

标题栏
IMKit 仅在默认的(RongConversationListActivity)中实现了标题栏功能。默认展示会话列表。
会话列表
会话列表组件按时间倒序显示所有会话的列表,置顶会话会排在最前。长按会话列表中的会话时显示弹窗菜单,IMKit 默认实现了置顶/取消置顶会话和删除会话功能。
会话列表中默认会话的视图由 PrivateConversationProvider.java 等模板类创建。您可继承使用 BaseDataProcessor,聚合(折叠)或过滤需要在列表中展示的会话项目。
如果开启了多设备消息同步,在换新设备登录或应用卸载重装场景下,离线补偿机制仅可获取到最近 1 天(默认离线补偿天数为 1 天,最大可调整为 7 天)的单聊、群聊会话消息。超出时限的会话无法通过离线补偿机制获取。因此,离线补偿后的会话列表可能与原设备上或卸载前的会话列表不一致(非数据丢失)。
用法
IMKit 提供了 Activity 和 Fragment 来创建会话列表页面。RongConversationListActivity 是默认提供的会话列表页面。您可以根据需要,选择直接使用默认的会话列表页面 Activity,或者继承 RongConversationListActivity,或者使用 ConversationListFragment 构建自定义会话列表 Activity。
IMKit SDK 默认已经实现在会话列表页点击某条会话时,跳转到对应的会话页面。
启动会话列表页面
IMKit 提供以下方式启动会话列表:
- 内置路由:
RouteUtils.routeToConversationListActivity(context, title); - 标准启动:
startActivity(new Intent(context, RongConversationListActivity.class));
使用 RouteUtils
RouteUtils 是 IMKit 内置的 Activity 路由器,封装了 SDK 内部各页面跳转方法。
如果您构建了自定义的会话列表 Activity,必须先向 RouteUtils 注册自定义 Activity,才能通过 RouteUtils 跳转到自定义会话列表 Activity,否则跳转的是 SDK 默认的 RongConversationListActivity。
跳转到会话列表 Activity:
参数说明
| 参数 | 类型 | 说明 |
|---|---|---|
| context | Context | activity 上下文 |
| title | String | 会话列表页面标题。如果传空,会显示为默认标题 “会话列表”。 |
示例代码
RouteUtils.routeToConversationListActivity(context, title);
通过 intent 跳转
您可以自己组装 Intent, 使用 Android 默认机制进行跳转。
Intent intent = new Intent(context, MyConversationListActivity.class);
context.startActivity(intent);
继承默认会话页面 Activity
您可以通过继承 RongConversationListActivity 创建自定义会话列表 Activity,实现对会话列表页面的调整。注意,必须向 RouteUtils 注册自定义的会话列表 Activity。注册之后,当 SDK 需要跳转到会话列表时,会跳转到您注册的自定义会话列表 Activity。注册方法在应用生命周期内、主进程中调用一次即可。
RouteUtils.registerActivity(RouteUtils.RongActivityType.ConversationListActivity, MyConversationListActivity.class);
使用 Fragment 构建自定义会话列表 Activity
IMKit SDK 提供的会话列表 Fragment 类名为 ConversationListFragment。为方便应用程序自定义会话列表页面,推荐继承使用会话列表 Fragment 类,构建自定义的会话列表 Activity。注意,自定义会话列表 Activity 需要被注册到 IMKit SDK 中,以替换 IMKit 默认的会话列表 Activity。
-
您可以在应用 Activity 中集成 IMKit 提供的会话列表 Fragment。以下示例声明一个新的
MyConversationListActivity。xml<activity
android:name=".ui.activity.MyConversationListActivity"
android:launchMode="singleTop"
android:screenOrientation="portrait"
android:windowSoftInputMode="stateHidden|adjustResize">
</activity> -
描述 Activity 布局。此处以
activity_conversation_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" //此容器用于动态放置 fragment
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout> -
继承 IMKit SDK 的
ConversationListFragment创建子类,例如AppConversationListFragment。在MyConversationListActivity的onCreate()方法中使用您自定义的会话列表 Fragment 子类。Javaclass MyConversationListActivity extends FragmentActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_conversation_list);
ConversationListFragment conversationListFragment=new AppConversationListFragment();
FragmentManager manager = getSupportFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
transaction.replace(R.id.container, conversationListFragment);
transaction.commit();
}
} -
向
RouteUtils注册自定义的会话列表 Activity,以替换 IMKit 默认的会话列表 Activity。方法在应用生命周期内、主进程中注册一次即可。参数说明
参数 类型 说明 activityType RongActivityType IMKit 内置的 Activity 类型枚举。此处为 RongActivityType.ConversationListActivityclass Class<? extends Activity>应用自定义的会话列表 Activity 的类名。 注册完成后,在 SDK 内部页面需要跳转到会话列表场景时,SDK 会自动跳转到您注册的应用 Activity。
示例代码
JavaRouteUtils.registerActivity(RouteUtils.RongActivityType.ConversationListActivity, MyConversationListActivity.class);
定制化
修改会话头像形状
会话列表中的每个会话项目上均会显示一个 头像图标,即会话头像(不是聊天页面内中消息列表中的头像)。单聊会话显示对方用户头像,群聊会话显示群组头像,聚合会话显示默认头像或应用程序主动设置的头像。支持通过 IMKit 全局配置单独控制会话列表中的会话头像样式。
会话头像显示默认为矩形,可修改为圆形。头像显示大小默认值为 48dp*48dp。此方法在用户设置头像后生效,不设置头像的情况下,无法根据此方法修改为圆角,默认为灰色矩型色块。请在 App 初始化之后调用以下代码进行设置:
RongConfigCenter.featureConfig().setKitImageEngine(new GlideKitImageEngine() {
@Override
public void loadConversationListPortrait(@NonNull Context context, @NonNull String url, @NonNull ImageView imageView, Conversation conversation) {
Glide.with(context).load(url)
.apply(RequestOptions.bitmapTransform(new CircleCrop()))
.into(imageView);
}
});
如需修改聊天页面内消息上显示的头像样式,请转至会话页面。
设置默认加载会话条目的数量
IMKit 在加载会话列表时(进入会话列表页面、上拉、下拉),默认从本地加载 100 条会话数据。您可以修改默认加载的会话条目数量。
RongConfigCenter.conversationListConfig().setCountPerPage();