自定义搜索界面
SDK 提供了搜索页面的自定义能力,包括新增搜索分类、移除默认搜索分类/修改排序/修改名称、修改UI效果等。可以通过参数配置、实现扩展协议两种方式来对搜索界面进行自定义。
配置方式
可以通过参数配置方式完成搜索界面的样式自定义,调整UI效果,包括搜索输入框,搜索分类TAB,默认搜索结果图标大小,文字效果等。 搜索界面配置定义在 KIMSearchConfig
中。
配置参数不修改表示使用默认效果
接口定义
KIMSearchConfig
inputTextHintColor | Int @ColorRes | 输入框提示问题颜色 |
---|---|---|
inputTextColor | Int @ColorRes | 输入框文本输入文本颜色 |
inputTextFont | TextFont | 输入框输入文本字体大小及样式 |
inputSearchIcon | Int? @DrawableRes | 输入框左侧搜索图标,未设置使用默认 |
inputClearIcon | Int? @DrawableRes | 输入框右侧清除按钮图标,未设置使用默认 |
inputClearText | Int? @StringRes | 输入框右侧清除文本,配置后不显示清除图标,显示文本 |
inputClearTextColor | Int? @ColorRes | 设置inputClearText后,配置其文本颜色 |
inputClearTextFont | TextFont? | 设置inputClearText后,配置其文字大小及样式 |
inputTextBackground | Int? @DrawableRes | 输入框背景,未设置使用默认 |
tabTextColor | Int @ColorRes | 搜索分类tab名称默认文本颜色 |
tabSelectedTextColor | Int @ColorRes | 搜索分类tab名称选中时文本颜色 |
tabTextFont | TextFont | 搜索分类tab名称文字大小及样式 |
tabBackground | Int? @DrawableRes | 搜索分类单个tab背景 |
tabBarBackground | Int? @DrawableRes | 搜索分类tab整体背景 |
tabIndicatorColor | Int @ColorRes | 搜索分类tab选中时底部指示条颜色 |
tabDividerLineColor | Int @ColorRes | 搜索分类tab 下分割线颜色 |
searchTabConfigs | List<TabConfig>? | 配置sdk内置对应tab属性【包括名称、顺序等】,通过 type 匹配 |
resultHighlightColor | Int @ColorRes | 搜索结果命中高亮颜色 |
resultTitleTextColor | Int? @ColorRes | 默认搜索结果样式 - title文字颜色,影响sdk内置搜索 |
resultTitleTextFont | TextFont? | 默认搜索结果样式 - title字体大小及样式,影响sdk内置搜索 |
resultSummaryTextColor | Int? @ColorRes | 默认搜索结果样式 - summary文字颜色,影响sdk内置搜索 |
resultSummaryTextFont | TextFont? | 认搜索结果样式 - summary文字样式,影响sdk内置搜索 |
resultIconSize | Int? @DimenRes | 默认搜索结果图标样式,图标默认大小 |
resultIconRadius | Int? @DimenRes | 默认搜索结果图标样式,图标圆角大小 |
resultItemBackground | Int @DrawableRes | 默认搜索结果背景 |
mergeTitleTextColor | Int @ColorRes | 全部TAB中,分组title文字颜色 |
mergeTitleTextFont | TextFont | 全部TAB中,分组title文字样式 |
mergeMoreTextColor | Int @ColorRes | 全部TAB中,分组'更多xxx'文字颜色 |
mergeMoreTextFont | TextFont | 全部TAB中,分组'更多xxx'文字样式 |
defaultPageConfig | KIMSearchPageConfig? | 默认搜索tab状态UI配置【包括loading、error、empty等】 |
filterTextColor | Int @ColorRes | 筛选项文本颜色 |
filterTextFont | TextFont | 筛选项文本大小及样式 |
filterItemBackground | Int @DrawableRes | 筛选项背景 |
TabConfig
对KIMExpSearchTab
部分属性进行二次配置,用于对内置搜索TAB进行调整,如名称、顺序等。
属性 | 类型 | 说明 |
---|---|---|
tabType | String | tab类型, 对应com.kingsoft.kim.api.search.ex.KIMExpSearchTab.type |
title | String? | 配置 tab 名称,覆盖内置名称,null 表示不修改 |
order | Int? | 配置 tab 排序权重,覆盖 com.kingsoft.kim.api.search.ex.KIMExpSearchTab.order null 表示不修改 |
orderInMerge | Int? | 在 '全部' 结果里面的排序 |
enable | Boolean? | 配置 tab 是否启用,默认启用 null 表示不修改配置 |
showInMerge | Boolean? | 修改配置是否显示在全部分类 |
pageConfig | KIMSearchPageConfig? | 修改对应tab页面配置效果 |
KIMSearchPageConfig
用于配置tab页面对应加载、错误、空等状态视图。每个TAB可以有自己的状态配置,defaultPageConfig会影响所有SDK内置TAB效果,想要修改指定TAB的效果在searchTabConfigs 中配置。
属性 | 类型 | 说明 |
---|---|---|
emptyLayoutRes | Int? @LayoutRes | 搜索结果空时的状态视图 |
loadingLayoutRes | Int? @LayoutRes | 搜索请求中状态视图 |
errorLayoutRes | Int? @LayoutRes | 搜索错误状态视图 |
errorRetryId | Int? | [errorLayoutRes] 存在重试按钮时的 id |
emptyInputLayoutRes | Int? @LayoutRes | 未输入关键字时的状态视图 |
以上列举了当前支持的配置,按需修改对应的配置项,建议在程序启动时去配置配置,不建议运行过程中随意修改配置。
协议方式
可以通过实现SDK扩展协议的方式进一步实现自定义配置及实现相关功能。协议实现会在执行到相关业务逻辑时初始化并调用。
接口定义
KIMExpPageSearch
对搜索主界面进行动态配置,代码设置效果会覆盖KIMSearchConfig
相关配置。
方法 | 参数 | 返回值 | 说明 |
---|---|---|---|
statusBarMode | Int? @StatusBarMode | 页面状态栏模式,亮色/暗色模式,SDK会以此切换状态栏模式 | |
configureTitleBar | commonTitleBar: CommonTitleBar | 配置状态栏,若需要单独配置搜索界面的背景或其他按钮可在此处理 | |
configureSearchEdit | editText: EditText | 配置输入框 | |
configureTabSetting | context: Context | View? | 配置搜索界面分类 tab 导航栏右侧菜单视图,注意自行控制ui尺寸。 |
onTabSettingClicked | view: View | 配置搜索界面分类 tab 导航栏右侧菜单视图点击事件【若未自己设置点击事件】。 |
KIMExpSearchTab
搜索分类扩展协议,表示一个搜索分类。定义如下:
方法 | 参数 | 返回值 | 说明 |
---|---|---|---|
type | String | 分类标识,满足唯一性 | |
titleRes | Int @StringRes | tab 名称,显示在tab里面的名称, 优先级低于 SearchTabConfig 配置的名称 | |
order | Int | 默认优先级,影响tab排序 默认通过 order 值由升序排序 优先级低于 SearchTabConfig 配置的 order | |
showInMerge | bool | 是否在"全部"结果中显示,默认显示 | |
orderInMerge | Int | 在 "全部" 结果中的 排序 默认和 order 一样,可通过重新调整在 '全部' 列表下分组的排序权重 | |
moreTextInMerge | String? | 在 '全部' 中,分组中更多item显示的文本,默认显示 更多+ tab名 | |
maxCountForMerge | Int | 在'全部'中最多显示数量,超出显示更多,默认3个 | |
pageConfig | KIMSearchPageConfig? | 状态页面UI配置 | |
enable | boolean | 是否启用,默认启用【举例场景:如分类tab需要通过配置确认,可在此根据配置或缓存处理】 | |
attributedHint | String? | 切换到tab时输入框提示文本,无配置时显示默认配置文本 | |
getFilterData | LiveData<List<KIMSearchFilterGroup>>? | 筛选项数据,返回对应数据后将在tab顶部显示搜索过滤项,搜索时在参数传递当前选中筛选项 | |
onFilterGroupClicked | hostFragment: Fragment, group: KIMSearchFilterGroup, callback: KIMFilterItemSelectedCallback | boolean | 筛选项点击时自定义处理,当不使用默认弹窗时,可在此处理 group:点击的组别及选中的位置 callback: 筛选后的回调,回调后将更新当前筛选项 返回true 表示将自行处理点击筛选后的选择逻辑,通过 [callback] 回调sdk |
contentView | context: Context | KIMSearchContentView | 自定义搜索结果内容视图,需要集成View,替换内部列表实现,注意:页面填充,adapter,分页等均需要自行处理 |
onRetry | 主动触发重试搜索,影响当前TAB | ||
search | keyword: String, params: KIMSearchParams?, callback: KIMSearchCallback<T> | 搜索接口 keyword:搜索关键字 params:搜索搜索参数 callback:搜索结果回调,请注意调用 |
KIMSearchFilterGroup
筛选组:
属性 | 类型 | 说明 |
---|---|---|
items | List<KIMSearchFilterItem> | 当前组别所有的筛选项 |
selected | KIMSearchFilterItem | 当前选中的筛选项 |
KIMSearchFilterItem
筛选项:
属性 | 类型 | 说明 |
---|---|---|
displayText | String | 筛选选中时展示文本 |
data | Any? | 筛选对应接口数据,在触发搜索时 sdk 透传 |
popMenuText | String? | 筛选弹窗显示的文本,null时默认显示 displayText |
KIMSearchParams
搜索参数:
属性 | 类型 | 说明 |
---|---|---|
lastPageInfo | Any? | 当前页面信息,由接入方控制,SDK透传。首页搜索时为null,下一页时为上次搜索接口callback返回的信息 |
filteredItems | List<KIMSearchFilterItem>? | 当前选中筛选项信息,若无筛选项则为null |
KIMSearchContentView
自定义搜索结果视图:
方法 | 参数 | 返回值 | 说明 |
---|---|---|---|
submitResult | result: KIMSearchResult<out KIMBaseSearchResultItem> | 搜索结果将通过这个接口提交到自定义视图,分页情况下会合并列表结果提交 |
KIMSearchCallback
, 搜索结果回调,搜索成功及失败时需要调用对应的接口
方法 | 参数 | 返回值 | 说明 |
---|---|---|---|
onSuccess | result: KIMSearchResult<T> | 搜索成功回调 | |
onFailed | code: String msg: String? |
KIMSearchResult<T : KIMBaseSearchResultItem>
,搜索成功返回的数据包装。
属性 | 类型 | 说明 |
---|---|---|
pageInfo | Any | 搜索分页本页数据,搜索下一页时SDK将在KIMSearchParams透传给 search接口 |
hasMore | Boolean | 是否还有更多,控制分页交互,没有数据后注意返回false |
items | List<T> | 搜索结果数据,SDK将根据数据类型绘制结果气泡 |
KIMBaseSearchResultItem
搜索返回数据包装类需要实现的基类,用于匹配需要绘制的Cell。
方法 | 参数 | 返回值 | 说明 |
---|---|---|---|
getStableId | String | 数据id,需要唯一 | |
areContentSame | other: KIMBaseSearchResultItem | Boolean | 数据比对,用于刷新UI |
KIMExpSearchMergeSubItem
'全部'中独立分类协作,若需要仅在"全部"tab的搜索结果中新增一个分类,但不需要有TAB,可通过此协议实现。
方法 | 参数 | 返回值 | 说明 |
---|---|---|---|
itemType | String | type说明,需要与tab#type一样保持唯一性。 | |
showCondition | Int, @ShowCondition | 显示条件,单独分类可设置展示的前置条件 | |
itemTitle | Int? @StringRes | 分组title, 默认将每个搜索的数据会有一个分组Title,若不需要返回null即可。 可以自己实现 ISearchItemNewGroup 实现分组效果 | |
orderInMerge | Int | 在"全部"结果中的 排序权重 | |
search | keyword: String, params: KIMSearchParams?, callback: KIMSearchCallback<KIMBaseSearchResultItem> | 搜索时调用,参数默认为null |
ShowCondition
名称 | 说明 |
---|---|
NO_CONDITION | 无前置条件,返回数据即显示 |
ONE_TAB_AVAILABLE | 有一个tab搜索结果就显示 |
ALL_TAB_AVAILABLE | 所有tab搜索有结果才显示 |
KIMSearchCustomTab
完全自定义搜索分类页面,若KIMExpSearchTab#contentView 无法满足自定义分类页面需求,可通过此协议处理。
方法 | 参数 | 返回值 | 说明 |
---|---|---|---|
createCustomPage | IKIMSearchCustomPage | 创建自己自定义搜索页面,每次需要创建新的实例 注意:必须是 androidx.fragment.app.Fragment 子类 | |
showInMerge | Boolean | 默认不显示在 ‘全部’,若需要显示在全部请重新返回true 显示在全部须在 IKIMSearchCustomPage.searchKey 的callback中回调要显示的数据 |
IKIMSearchCustomPage
方法 | 参数 | 返回值 | 说明 |
---|---|---|---|
searchKey | keyword: String showInMergeCallback: KIMSearchCallback<KIMBaseSearchResultItem> | keyword 搜索关键字 showInMergeCallback 如需显示在'全部',需要调用此回调,注意无论成功、空结果还是失败都请调用此callback,避免显示异常。 |
注意,所有协议均需要在对应的KIMSdkApplication
注册才能起作用。
自定义示例
样式配置
搜索页面样式配置需要在搜索页面加载之前进行,可以通过修改 KIMSearchConfig
中定义的各种属性达到个性化样式配置。
默认搜索框 | 自定义搜索框 |
---|---|
![]() | ![]() |
代码示例:
private fun applySearchConfig() {
KIM.searchModule.searchConfig.apply {
inputTextBackground = R.drawable.app_search_bg_purple
inputSearchIcon = R.drawable.ic_search_icon
inputTextColor = R.color.titlebar_icon
inputTextHintColor = R.color.titlebar_icon
}
}
自定义默认搜索分类
修改默认搜索菜单信息

又比如:需要修改搜索输入框的Hint文本,修改全部TAB名称,移除联系人搜索TAB,修改默认结果图标圆角及尺寸,可按如下方式配置:
代码示例
KIM.searchModule.searchConfig.apply {
inputTextHint = R.string.app_search_edit_hint
searchTabConfigs = listOf(
KIMSearchConfig.TabConfig(KIM_ALL).apply {
enable = true // 是否启用
title = "全部" // tab名称
order = 10 // tab排序
},
KIMSearchConfig.TabConfig(KIM_MESSAGE_HISTORY).apply {
enable = false
title = "聊天记录"
order = 10
},
KIMSearchConfig.TabConfig(KIM_CLOUD_DOC).apply {
enable = false
title = "云文档"
order = 5
},
KIMSearchConfig.TabConfig(KIM_ROBOT).apply {
enable = false
title = "机器人"
order = 5
},
KIMSearchConfig.TabConfig(KIM_CONTACT).apply {
enable = true
title = "联系人"
order = 5
},
KIMSearchConfig.TabConfig(KIM_GROUP).apply {
enable = true
title = "群聊"
order = 15
},
KIMSearchConfig.TabConfig(KIM_CHAT_FILE).apply {
enable = true
title = "聊天文件"
order = 20
},
KIMSearchConfig.TabConfig(KIM_EMAIL).apply {
enable = false
title = "邮件"
order = 5
},
KIMSearchConfig.TabConfig("kim-ai").apply {
enable = false
title = "智慧助理"
order = 25
}
)
resultIconSize = R.dimen.search_dp_30
resultIconRadius = R.dimen.search_dp_3
}
SDK内置搜索说明
KIMSearchConfig
中定义了SDK中内置tab的type,需要配置相关分类可引用对应常量配置。
名称 | 值 | 说明 |
---|---|---|
KIM_ALL | kim-all | 全部 |
KIM_MESSAGE_HISTORY | kim-message-history | 聊天记录 |
KIM_CLOUD_DOC | kim-cloud-doc | 云文档 |
KIM_ROBOT | kim-robot | 机器人 |
KIM_CONTACT | kim-contact | 联系人 |
KIM_GROUP | kim-group | 群聊 |
KIM_CHAT_FILE | kim-message-file | 聊天文件 |
KIM_EMAIL | kim-email | 邮件 |
KIM_AI | kim-ai | 智慧助理 |
默认tab排序
名称 | 值 | 说明 |
---|---|---|
KIM_ORDER_ALL | 0 | 全部 |
KIM_ORDER_MESSAGE_HISTORY | 10 | 聊天记录 |
KIM_ORDER_CLOUD_DOC | 20 | 云文档 |
KIM_ORDER_ROBOT | 30 | 机器人 |
KIM_ORDER_EMAIL | 35 | 邮件 |
KIM_ORDER_CONTACT | 40 | 联系人 |
KIM_ORDER_GROUP | 50 | 群聊 |
KIM_ORDER_CHAT_FILE | 60 | 聊天文件 |
若需调整默认分类配置,可以参考这些定义。如需将新增TAB放在SDK内置聊天记录TAB前,将 order 返回值比 KIM_ORDER_MESSAGE_HISTORY 小即可,需要关闭部分内置搜索tab,修改对应tab的enable
属性即可。
新增搜索分类
使用默认的cell样式新增分类
SDK 支持接入开发者自研的搜索分类,如待办搜索、会议搜索,同时显示到"全部"TAB内,效果如下:

实现KIMExpSearchTab
来表示一个搜索分类,实现对应的方法,具体定义如下:
代码示例
class AppTitleSummarySearchTab : KIMExpSearchTab<AppTitleSummaryItem>() {
override fun type(): String {
return "app-title-summary" //注意保持唯一性
}
override fun titleRes(): Int {
return R.string.app_title_summary_search_title
}
override fun order(): Int {
return KIMSearchConfig.KIM_ORDER_CHAT_FILE + 5 //影响TAB位置
}
override fun orderInMerge(): Int {
return KIMSearchConfig.KIM_MERGE_ORDER_CHAT_FILE + 5 //影响在全部中的位置
}
override fun pageConfig(): KIMSearchPageConfig? {
return KIMSearchPageConfig(R.drawable.ic_empty_status, R.string.app_search_empty_tip)
}
override fun search(
keyword: String,
params: KIMSearchParams?,
callback: KIMSearchCallback<KIMBaseSearchResultItem>
) {
//注意:search在主线程调用 以下逻辑在子线程处理
...//线程切换,接口请求解析数据
val pageInfo = ... //组装分页信息
val hasMore = ... //确认是否还有更多
val items = mutableListOf<AppTitleSummaryItem>()
... //组装数据列表
callback.onSuccess(KIMSearchResult(pageInfo, hasMore, items))
}
}
注册搜索分类,接口实现后需要在对应的KIMSdkApplication
注册才能起作用,具体实现如下:
class DemoSdkApplication : KIMSdkApplication() {
override fun confMeatsOnBone(): KConf<Meat> {
return kConfOf(
... //其他扩展注册
KIMExpSearchTab::class.java confTo AppTitleSummarySearchTab::class.java
)
}
}
这样,就在搜索内注册了一个新的搜索分类,但当前 SDK 并不知道该如何绘制搜索结果,还需要继续实现搜索结果Item的绘制。
KIMExpSearchBaseCell
自定义搜索结果绘制,搜索列表Adapter使用其绘制列表Item,在所有的tab列表生效。SDK 通过搜索接口返回的 KIMBaseSearchResultItem
具体实现类型匹配需要绘制的气泡Cell
,每个数据类型需要且唯一对应一个Cell。Cell
负责搜索结果的绘制,具体实现如下:
方法 | 参数 | 返回值 | 说明 |
---|---|---|---|
createView | parent: ViewGroup | KIMExpSearchBaseItemView | 创建该Cell对应的View,Cell定位类似工厂类,正常实现createView即可。具体UI绘制在ItemView处理。 |
KIMExpSearchBaseItemView
,具体View绘制
方法 | 参数 | 返回值 | 说明 |
---|---|---|---|
onCreated | 视图创建后调用 | ||
onBind | data: D payloads: MutableList<Any> | 数据绑定,在此通过数据区绘制更新搜索结果的UI | |
onItemClicked | itemView: View item: D | 点击事件,当cell被点击时回调 | |
getScene | String | 获取当前列表场景: "tab_list" - 分类tab "merge_list" - 全部tab |
实现时,首先定义搜索结果数据类型,包装自己的搜索结果,在search接口返回。
class AppTitleSummaryItem(val id: String, val title: CharSequence, val summary: CharSequence): KIMBaseSearchResultItem() {
override fun getStableId(): String {
return id
}
override fun areContentSame(other: KIMBaseSearchResultItem): Boolean {
if (other !is AppTitleSummaryItem) return false
return title == other.title && summary == other.summary
}
}
然后实现搜索气泡 KIMExpSearchBaseCell
,以及KIMExpSearchBaseItemView
:
class AppSearchTitleSummaryCell : KIMExpSearchBaseCell<AppTitleSummaryItemView, AppTitleSummaryItem>() {
override fun createView(parent: ViewGroup): AppTitleSummaryItemView {
return AppTitleSummaryItemView(ItemSearchTitleSummaryBinding.inflate(parent.inflater, parent, false))
}
}
class AppTitleSummaryItemView(val binding: ItemSearchTitleSummaryBinding) :
KIMExpSearchBaseItemView<AppTitleSummaryItem>(binding.root) {
override fun onBind(data: AppTitleSummaryItem, payloads: MutableList<Any>) {
binding.tvTitle.text = data.title
binding.tvSummary.text = data.summary
}
override fun onItemClicked(itemView: View, item: AppTitleSummaryItem) {
WToastUtil.show("自定义点击事件")
}
}
同样,最后需要完成注册对应气泡实现
class DemoSdkApplication : KIMSdkApplication() {
override fun confMeatsOnBone(): KConf<Meat> {
return kConfOf(
... //其他扩展注册
KIMExpSearchTab::class.java confTo AppTitleSummarySearchTab::class.java,
KIMExpSearchBaseCell::class.java confTo AppSearchTitleSummaryCell::class.java
)
}
}
至此,SDK 可以正确通过实现的Cell在列表绘制结果,注意这些UI相关在主线程执行,禁止耗时操作。
完全自定义搜索分类页面(自定义cell样式)
若分类搜索列表形式无法完全需求,WOASDK 也支持搜索分类页面完全自定义,WOASDK 只负责转发搜索关键字,UI处理、接口请求、错误等处理完全自定义实现。
若只需调整结果列表实现,其他控制还希望使用SDK效果,建议使用KIMExpSearchTab#contentView 实现自定义结果视图实现。
自定义分类页面TAB需要继承实现 KIMSearchCustomTab
,重写声明方法,并按以上搜索分类注册方式完成注册KIMExpSearchTab
即可。
代码示例
class AppCustomPageTab : KIMSearchCustomTab() {
override fun createCustomPage(): IKIMSearchCustomPage {
//自定义的Fragment处理搜索
return AppSearchCustomFragment()
}
override fun type(): String {
return "app-card"
}
override fun titleRes(): Int {
return R.string.app_search_title_3
}
override fun order(): Int {
return 15
}
}
class AppSearchCustomFragment : Fragment(), IKIMSearchCustomPage {
....
}
使用SDK内置搜索结果样式
SDK 内部提供了默认的搜索结果样式,包括图标、标题、描述三部分【效果参考聊天记录样式】,且跟随 KIMSearchConfig
的自定义配置。使用默认样式无需实现自己的Cell绘制,简化接入。若需要使用内置通用cell样式,需要在搜索接口返回KIMSearchCommonItem
包装类。
KIMSearchCommonItem
通用数据模型,SDK实现绘制,提供图片、标题、摘要等通用绘制需求。定义如下:
/**
* 通用数据模型,SDK实现绘制,提供图片、标题、摘要等通用绘制需求
*
* @param result 数据接口,接入放数据按接口返回数据即可
* @param type 对应 [KIMExpSearchTab.type] 类型,匹配点击事件分发
*/
class KIMSearchCommonItem(val result: ISearchResultCommonData, val type: String) : KIMBaseSearchResultItem() {
override fun getStableId(): String {
return result.stableId
}
override fun areContentSame(other: KIMBaseSearchResultItem): Boolean {
if (other !is KIMSearchCommonItem) {
return false
}
return result.title == other.result.title
&& result.summary == other.result.summary
&& result.icon == other.result.icon
}
}
具体数据类型需要实现ISearchResultCommonData
接口提供标题,图标,描述等信息。
ISearchResultCommonData
属性 | 类型 | 说明 |
---|---|---|
stableId | String | 唯一id |
icon | String | 图标 |
title | CharSequence | 标题 |
summary | CharSequence | 描述 |
titleHighlightKeys | List<String>? | 标题 需要高亮的关键字集合 |
summaryHighlightKeys | List<String>? | 描述 需要高亮的关键字集合 |
KIMExpSearchCommonTab
为响应点击事件,可继承KIMExpSearchCommonTab
。
方法 | 参数 | 返回值 | 说明 |
---|---|---|---|
onItemClicked | itemView: View item: KIMSearchCommonItem | item 点击事件,通过 ISearchResultCommonData.type 与 type 匹配 |
代码示例
实现 KIMExpSearchCommonTab
,处理cell点击事件。
class AppCommonSearchTab : KIMExpSearchCommonTab() {
override fun onItemClicked(itemView: View, item: KIMSearchCommonItem) {
...//处理点击事件
}
override fun type(): String {
return "app-common"
}
override fun titleRes(): Int {
return R.string.app_title_summary_search_title_2
}
override fun order(): Int {
//配置显示在云文档前
return KIMCfgSearchConfig.KIM_ORDER_CLOUD_DOC - 5
}
override fun search(
keyword: String,
params: KIMSearchParams?,
callback: KIMSearchCallback<KIMSearchCommonItem>
) {
//注意:search在主线程调用 以下逻辑在子线程处理
...//线程切换,接口请求解析数据
val pageInfo = ... //组装分页信息
val hasMore = ... //确认是否还有更多
val items = mutableListOf<KIMSearchCommonItem>()
val commonData = MyCommonData(id, icon, title, summary, listOf(keyword))
items.add(KIMSearchCommonItem(commonData, "app-common"))
... //处理数据
callback.onSuccess(KIMSearchResult(pageInfo, hasMore, items))
}
class MyCommonData(
override val stableId: String,
override val icon: String,
override val title: CharSequence,
override val summary: CharSequence,
override val summaryHighlightKeys: List<String>?
) : ISearchResultCommonData
}
注意,tab实现同样还是要在KIMSdkApplication
注册。
class DemoSdkApplication : KIMSdkApplication() {
override fun confMeatsOnBone(): KConf<Meat> {
return kConfOf(
...
KIMExpSearchBaseCell::class.java confTo AppSearchTitleSummaryCell::class.java,
KIMExpSearchTab::class.java confTo AppTitleSummarySearchTab::class.java,
KIMExpSearchTab::class.java confTo AppCommonSearchTab::class.java
)
}
}
具体可以参考 WOASDKDemo 代码。
配置搜索分类栏右侧设置视图
WOASDK 支持在搜索标签栏右侧新增按钮,以实现自定义配置需求(如新增排序按钮),默认不显示,可通过实现扩展自行配置。

代码示例
class AppSearchPage : KIMExpPageSearch() {
override fun configureTabSetting(context: Context): View? {
val iconView = ImageView(context)
iconView.setImageResource(R.drawable.ic_app_sort)
return iconView
}
override fun onTabSettingClicked(view: View) {
val intent = Intent(view.context, AppSearchTabManagerActivity::class.java)
view.context.startActivity(intent)
}
}
注意扩展均需要注册才能生效:
override fun confMeatsOnBone(): KConf<Meat> {
return kConfOf(
...
KIMExpPageSearch::class.java confTo AppSearchPage::class.java
)
}
搜索分类排序动态更新
为满足用户自定义搜索分类排序需求,搜索分类支持动态调整分类排序,并在本地缓存分类排序,注意:接口动态设置的将排序优先于初始化参数配置的TAB排序。

动态排序相关接口在KIMISdkSearchService
中定义:
方法 | 参数 | 返回值 | 说明 |
---|---|---|---|
getSearchTabOrderList | List<KIMSearchTab> 按显示顺序排序好的分类列表 | 获取当前排序后的搜索分类列表 | |
updateSearchTabOrder | newOrderList: List<KIMSearchTab> 搜索分类顺序列表 | 按列表顺序更新搜索分类显示位置,更新后 SDK 会缓存该列表顺序,优先使用此列表位置显示搜索分类位置 注意:这里只影响排序,若设置的list内只包含部分搜索分类,不包含的搜索分类只会清除其排序设置 |
KIMSearchTab
属性 | 类型 | 说明 |
---|---|---|
type | String | 搜索 tab 类型 |
name | String | 搜索 tab 名称 |
代码示例
val newItemList = adapter.items.toList() //自己UI修改后的排序
KIM.getService().getLinkUpService(KIMISdkSearchService::class.java)?.updateSearchTabOrder(newItemList)
具体可参考Demo示例。
‘全部’中单独配置分类

通过实现KIMExpSearchMergeSubItem
扩展完成对应功能。
代码示例
class AppMoreSearchMergeSub : KIMExpSearchMergeSubItem() {
override fun showCondition(): Int {
return ShowCondition.ONE_TAB_AVAILABLE
}
override fun itemTitle(): Int? {
return R.string.app_search_more2
}
override fun itemType(): String {
return "app_more2"
}
override fun orderInMerge(): Int {
//放在最后
return 500
}
override fun search(
keyword: String,
params: KIMSearchParams?,
callback: KIMSearchCallback<KIMBaseSearchResultItem>
) {
val items = mutableListOf<KIMBaseSearchResultItem>()
repeat(2) {
items.add(AppMoreItem(keyword, it.toString()))
}
callback.onSuccess(KIMSearchResult("", false, items))
}
}
注意根据自己返回的Item类型,实现对应的cell,并注册对应扩展实现。
override fun confMeatsOnBone(): KConf<Meat> {
return kConfOf(
...
KIMExpSearchBaseCell::class.java confTo AppMoreItemCell::class.java,
KIMExpSearchMergeSubItem::class.java confTo AppMoreSearchMergeSub::class.java
...
)
}
SDK 会根据配置的title显示默认的分组标题,若想自己绘制分组标题,可以不配置title,自己在搜索结果中配置标题栏,返回的结果列表首个数据实现ISearchItemNewGroup
即可,并实现对应的Cell。
class AppSearchDivTitleItem(val title: String) : KIMBaseSearchResultItem(), ISearchItemNewGroup { ... }
class AppSearchDivTitleCell :KIMExpSearchBaseCell<AppSearchDivTitleView, AppSearchDivTitleItem>() { ... }
其他说明
- TAB页面状态配置:
KIMSearchPageConfig
WOASDK支持对搜索页面的loading、empty、error状态进行配置,可按需求针对全局或单独配置:
KIMSearchPageConfig
属性 | 类型 | 说明 |
---|---|---|
emptyLayoutRes | Int? @LayoutRes | 空结果时显示的layout |
loadingLayoutRes | Int? @LayoutRes | 搜索过程中显示的layout |
errorLayoutRes | Int? @LayoutRes | 错误情况下显示的layout |
errorRetryId | Int? @IdRes | 若错误的layout,需要重试按钮,可配置此id,点击重试 |
WOASDK 有默认的状态效果,支持不同程度地修改配置:
修改全部的默认效果,可通过KIMCfgSearchConfig#defaultPageConfig
配置所有tab的默认情况。修改自己新增TAB的效果,在KIMExpSearchTab
重写pageConfig()
返回需要的配置。修改内置的TAB的效果,通过KIMCfgSearchConfig#searchTabConfigs#pageConfig
实现。
- 关键字高亮说明
若自行绘制的搜索结果cell,关键字命中高亮需要接入方自行处理, SDK 提供了工具类实现文本高亮:com.kingsoft.kim.kit.search.util.KIMSearchUtil#highlightText
方法说明:
/**
* 对数据字符串进行高亮
*
* @param source 源内容
* @param targets 需要高亮的关键字集合
* @param highlightColor 颜色
*/
fun highlightText(
source: CharSequence,
targets: List<String>?,
highlightColor: Int = 0xFF417FF9.toInt()
): CharSequence
若使用 SDK 内置的气泡实现,可以通过ISearchResultCommonData
对应的方法实现。
/**
* 标题 需要高亮的关键字集合
*/
val titleHighlightKeys: List<String>?
get() = null
/**
* 描述 需要高亮的关键字集合
*/
val summaryHighlightKeys: List<String>?
get() = null
或者自行处理,在title/summary直接返回对应的SpannableString即可。
- 分割线处理
SDK 列表默认为每个item都绘制了分割线,若不需要 SDK 的分割线,在自己的ItemView 绘制,数据包装类实现 com.kingsoft.kim.kit.search.ex.ISearchItemNoDivider
即可。示例:
class AppTitleSummaryItem(val id: String, val title: CharSequence, val summary: CharSequence) : KIMBaseSearchResultItem(), ISearchResultNoDivider
注意在布局中自行处理分割线,可以参考 WOASDKDemo。
- 排除不需要显示在 '全部' 结果列表的Item
非自定义搜索分类页面,且KIMExpSearchTab#showInMerge
返回true的情况下,默认会将首页搜索结果前三项转发到'全部'列表显示,若分类列表自己处理了类似分组等形式,或不希望某个类型的ITEM不在'全部'列表显示,将该类型实现ISearchItemExcludeInMerge
即可。
//这里声明不使用默认分割线,需要自己在ItemView绘制
//声明不这个类型不需要显示在 全部 列表
class AppGroupNameItem(val name: String) : KIMBaseSearchResultItem(), ISearchItemNoDivider, ISearchItemExcludeInMerge
具体可参考WOASDKDemo示例。