Skip to content
能力中心
产品中心
应用市场
WebOffice
开发者后台

自定义搜索界面

SDK 提供了搜索页面的自定义能力,包括新增搜索分类、移除默认搜索分类/修改排序/修改名称、修改UI效果等。可以通过参数配置、实现扩展协议两种方式来对搜索界面进行自定义。

配置方式

可以通过参数配置方式完成搜索界面的样式自定义,调整UI效果,包括搜索输入框,搜索分类TAB,默认搜索结果图标大小,文字效果等。 搜索界面配置定义在 KIMSearchConfig 中。

配置参数不修改表示使用默认效果

接口定义

KIMSearchConfig

inputTextHintColorInt
@ColorRes
输入框提示问题颜色
inputTextColorInt
@ColorRes
输入框文本输入文本颜色
inputTextFontTextFont输入框输入文本字体大小及样式
inputSearchIconInt?
@DrawableRes
输入框左侧搜索图标,未设置使用默认
inputClearIconInt?
@DrawableRes
输入框右侧清除按钮图标,未设置使用默认
inputClearTextInt?
@StringRes
输入框右侧清除文本,配置后不显示清除图标,显示文本
inputClearTextColorInt?
@ColorRes
设置inputClearText后,配置其文本颜色
inputClearTextFontTextFont?设置inputClearText后,配置其文字大小及样式
inputTextBackgroundInt?
@DrawableRes
输入框背景,未设置使用默认
tabTextColorInt
@ColorRes
搜索分类tab名称默认文本颜色
tabSelectedTextColorInt
@ColorRes
搜索分类tab名称选中时文本颜色
tabTextFontTextFont搜索分类tab名称文字大小及样式
tabBackgroundInt?
@DrawableRes
搜索分类单个tab背景
tabBarBackgroundInt?
@DrawableRes
搜索分类tab整体背景
tabIndicatorColorInt
@ColorRes
搜索分类tab选中时底部指示条颜色
tabDividerLineColorInt
@ColorRes
搜索分类tab 下分割线颜色
searchTabConfigsList<TabConfig>?配置sdk内置对应tab属性【包括名称、顺序等】,通过 type 匹配
resultHighlightColorInt
@ColorRes
搜索结果命中高亮颜色
resultTitleTextColorInt?
@ColorRes
默认搜索结果样式 - title文字颜色,影响sdk内置搜索
resultTitleTextFontTextFont?默认搜索结果样式 - title字体大小及样式,影响sdk内置搜索
resultSummaryTextColorInt?
@ColorRes
默认搜索结果样式 - summary文字颜色,影响sdk内置搜索
resultSummaryTextFontTextFont?认搜索结果样式 - summary文字样式,影响sdk内置搜索
resultIconSizeInt?
@DimenRes
默认搜索结果图标样式,图标默认大小
resultIconRadiusInt?
@DimenRes
默认搜索结果图标样式,图标圆角大小
resultItemBackgroundInt
@DrawableRes
默认搜索结果背景
mergeTitleTextColorInt
@ColorRes
全部TAB中,分组title文字颜色
mergeTitleTextFontTextFont全部TAB中,分组title文字样式
mergeMoreTextColorInt
@ColorRes
全部TAB中,分组'更多xxx'文字颜色
mergeMoreTextFontTextFont全部TAB中,分组'更多xxx'文字样式
defaultPageConfigKIMSearchPageConfig?默认搜索tab状态UI配置【包括loading、error、empty等】
filterTextColorInt
@ColorRes
筛选项文本颜色
filterTextFontTextFont筛选项文本大小及样式
filterItemBackgroundInt
@DrawableRes
筛选项背景

TabConfig

KIMExpSearchTab部分属性进行二次配置,用于对内置搜索TAB进行调整,如名称、顺序等。

属性类型说明
tabTypeStringtab类型, 对应com.kingsoft.kim.api.search.ex.KIMExpSearchTab.type
titleString?配置 tab 名称,覆盖内置名称,null 表示不修改
orderInt?配置 tab 排序权重,覆盖 com.kingsoft.kim.api.search.ex.KIMExpSearchTab.order
null 表示不修改
orderInMergeInt?在 '全部' 结果里面的排序
enableBoolean?配置 tab 是否启用,默认启用
null 表示不修改配置
showInMergeBoolean?修改配置是否显示在全部分类
pageConfigKIMSearchPageConfig?修改对应tab页面配置效果

KIMSearchPageConfig

用于配置tab页面对应加载、错误、空等状态视图。每个TAB可以有自己的状态配置,defaultPageConfig会影响所有SDK内置TAB效果,想要修改指定TAB的效果在searchTabConfigs 中配置。

属性类型说明
emptyLayoutResInt?
@LayoutRes
搜索结果空时的状态视图
loadingLayoutResInt?
@LayoutRes
搜索请求中状态视图
errorLayoutResInt?
@LayoutRes
搜索错误状态视图
errorRetryIdInt?[errorLayoutRes] 存在重试按钮时的 id
emptyInputLayoutResInt?
@LayoutRes
未输入关键字时的状态视图

以上列举了当前支持的配置,按需修改对应的配置项,建议在程序启动时去配置配置,不建议运行过程中随意修改配置。

协议方式

可以通过实现SDK扩展协议的方式进一步实现自定义配置及实现相关功能。协议实现会在执行到相关业务逻辑时初始化并调用。

接口定义

KIMExpPageSearch

对搜索主界面进行动态配置,代码设置效果会覆盖KIMSearchConfig相关配置。

方法参数返回值说明
statusBarModeInt?
@StatusBarMode
页面状态栏模式,亮色/暗色模式,SDK会以此切换状态栏模式
configureTitleBarcommonTitleBar: CommonTitleBar配置状态栏,若需要单独配置搜索界面的背景或其他按钮可在此处理
configureSearchEditeditText: EditText配置输入框
configureTabSettingcontext: ContextView?配置搜索界面分类 tab 导航栏右侧菜单视图,注意自行控制ui尺寸。
onTabSettingClickedview: View配置搜索界面分类 tab 导航栏右侧菜单视图点击事件【若未自己设置点击事件】。

KIMExpSearchTab

搜索分类扩展协议,表示一个搜索分类。定义如下:

方法参数返回值说明
typeString分类标识,满足唯一性
titleResInt
@StringRes
tab 名称,显示在tab里面的名称,
优先级低于 SearchTabConfig 配置的名称
orderInt默认优先级,影响tab排序
默认通过 order 值由升序排序
优先级低于 SearchTabConfig 配置的 order
showInMergebool是否在"全部"结果中显示,默认显示
orderInMergeInt在 "全部" 结果中的 排序
默认和 order 一样,可通过重新调整在 '全部' 列表下分组的排序权重
moreTextInMergeString?在 '全部' 中,分组中更多item显示的文本,默认显示 更多+ tab名
maxCountForMergeInt在'全部'中最多显示数量,超出显示更多,默认3个
pageConfigKIMSearchPageConfig?状态页面UI配置
enableboolean是否启用,默认启用【举例场景:如分类tab需要通过配置确认,可在此根据配置或缓存处理】
attributedHintString?切换到tab时输入框提示文本,无配置时显示默认配置文本
getFilterDataLiveData<List<KIMSearchFilterGroup>>?筛选项数据,返回对应数据后将在tab顶部显示搜索过滤项,搜索时在参数传递当前选中筛选项
onFilterGroupClickedhostFragment: Fragment,
group: KIMSearchFilterGroup,
callback: KIMFilterItemSelectedCallback
boolean筛选项点击时自定义处理,当不使用默认弹窗时,可在此处理
group:点击的组别及选中的位置
callback: 筛选后的回调,回调后将更新当前筛选项
返回true 表示将自行处理点击筛选后的选择逻辑,通过 [callback] 回调sdk
contentViewcontext: ContextKIMSearchContentView自定义搜索结果内容视图,需要集成View,替换内部列表实现,注意:页面填充,adapter,分页等均需要自行处理
onRetry主动触发重试搜索,影响当前TAB
searchkeyword: String,
params: KIMSearchParams?,
callback: KIMSearchCallback<T>
搜索接口
keyword:搜索关键字
params:搜索搜索参数
callback:搜索结果回调,请注意调用

KIMSearchFilterGroup筛选组:

属性类型说明
itemsList<KIMSearchFilterItem>当前组别所有的筛选项
selectedKIMSearchFilterItem当前选中的筛选项

KIMSearchFilterItem筛选项:

属性类型说明
displayTextString筛选选中时展示文本
dataAny?筛选对应接口数据,在触发搜索时 sdk 透传
popMenuTextString?筛选弹窗显示的文本,null时默认显示 displayText

KIMSearchParams 搜索参数:

属性类型说明
lastPageInfoAny?当前页面信息,由接入方控制,SDK透传。首页搜索时为null,下一页时为上次搜索接口callback返回的信息
filteredItemsList<KIMSearchFilterItem>?当前选中筛选项信息,若无筛选项则为null

KIMSearchContentView 自定义搜索结果视图:

方法参数返回值说明
submitResultresult: KIMSearchResult<out KIMBaseSearchResultItem>搜索结果将通过这个接口提交到自定义视图,分页情况下会合并列表结果提交

KIMSearchCallback, 搜索结果回调,搜索成功及失败时需要调用对应的接口

方法参数返回值说明
onSuccessresult: KIMSearchResult<T>搜索成功回调
onFailedcode: String
msg: String?

KIMSearchResult<T : KIMBaseSearchResultItem>,搜索成功返回的数据包装。

属性类型说明
pageInfoAny搜索分页本页数据,搜索下一页时SDK将在KIMSearchParams透传给 search接口
hasMoreBoolean是否还有更多,控制分页交互,没有数据后注意返回false
itemsList<T>搜索结果数据,SDK将根据数据类型绘制结果气泡

KIMBaseSearchResultItem搜索返回数据包装类需要实现的基类,用于匹配需要绘制的Cell。

方法参数返回值说明
getStableIdString数据id,需要唯一
areContentSameother: KIMBaseSearchResultItemBoolean数据比对,用于刷新UI

KIMExpSearchMergeSubItem

'全部'中独立分类协作,若需要仅在"全部"tab的搜索结果中新增一个分类,但不需要有TAB,可通过此协议实现。

方法参数返回值说明
itemTypeStringtype说明,需要与tab#type一样保持唯一性。
showConditionInt,
@ShowCondition
显示条件,单独分类可设置展示的前置条件
itemTitleInt?
@StringRes
分组title, 默认将每个搜索的数据会有一个分组Title,若不需要返回null即可。
可以自己实现 ISearchItemNewGroup实现分组效果
orderInMergeInt在"全部"结果中的 排序权重
searchkeyword: String,
params: KIMSearchParams?,
callback: KIMSearchCallback<KIMBaseSearchResultItem>
搜索时调用,参数默认为null

ShowCondition

名称说明
NO_CONDITION无前置条件,返回数据即显示
ONE_TAB_AVAILABLE有一个tab搜索结果就显示
ALL_TAB_AVAILABLE所有tab搜索有结果才显示

KIMSearchCustomTab

完全自定义搜索分类页面,若KIMExpSearchTab#contentView 无法满足自定义分类页面需求,可通过此协议处理。

方法参数返回值说明
createCustomPageIKIMSearchCustomPage创建自己自定义搜索页面,每次需要创建新的实例
注意:必须是 androidx.fragment.app.Fragment 子类
showInMergeBoolean默认不显示在 ‘全部’,若需要显示在全部请重新返回true
显示在全部须在 IKIMSearchCustomPage.searchKey的callback中回调要显示的数据

IKIMSearchCustomPage

方法参数返回值说明
searchKeykeyword: String
showInMergeCallback: KIMSearchCallback<KIMBaseSearchResultItem>
keyword 搜索关键字
showInMergeCallback 如需显示在'全部',需要调用此回调,注意无论成功、空结果还是失败都请调用此callback,避免显示异常。

注意,所有协议均需要在对应的KIMSdkApplication注册才能起作用。

自定义示例

样式配置

搜索页面样式配置需要在搜索页面加载之前进行,可以通过修改 KIMSearchConfig 中定义的各种属性达到个性化样式配置。

默认搜索框自定义搜索框

代码示例:

Plaintext
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,修改默认结果图标圆角及尺寸,可按如下方式配置:

代码示例
Kotlin
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_ALLkim-all全部
KIM_MESSAGE_HISTORYkim-message-history聊天记录
KIM_CLOUD_DOCkim-cloud-doc云文档
KIM_ROBOTkim-robot机器人
KIM_CONTACTkim-contact联系人
KIM_GROUPkim-group群聊
KIM_CHAT_FILEkim-message-file聊天文件
KIM_EMAILkim-email邮件
KIM_AIkim-ai智慧助理

默认tab排序

名称说明
KIM_ORDER_ALL0全部
KIM_ORDER_MESSAGE_HISTORY10聊天记录
KIM_ORDER_CLOUD_DOC20云文档
KIM_ORDER_ROBOT30机器人
KIM_ORDER_EMAIL35邮件
KIM_ORDER_CONTACT40联系人
KIM_ORDER_GROUP50群聊
KIM_ORDER_CHAT_FILE60聊天文件

若需调整默认分类配置,可以参考这些定义。如需将新增TAB放在SDK内置聊天记录TAB前,将 order 返回值比 KIM_ORDER_MESSAGE_HISTORY 小即可,需要关闭部分内置搜索tab,修改对应tab的enable属性即可。

新增搜索分类

使用默认的cell样式新增分类

SDK 支持接入开发者自研的搜索分类,如待办搜索、会议搜索,同时显示到"全部"TAB内,效果如下:

实现KIMExpSearchTab来表示一个搜索分类,实现对应的方法,具体定义如下:

代码示例
Kotlin
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注册才能起作用,具体实现如下:

Kotlin
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 负责搜索结果的绘制,具体实现如下:

方法参数返回值说明
createViewparent: ViewGroupKIMExpSearchBaseItemView创建该Cell对应的View,Cell定位类似工厂类,正常实现createView即可。具体UI绘制在ItemView处理。

KIMExpSearchBaseItemView,具体View绘制

方法参数返回值说明
onCreated视图创建后调用
onBinddata: D
payloads: MutableList<Any>
数据绑定,在此通过数据区绘制更新搜索结果的UI
onItemClickeditemView: View
item: D
点击事件,当cell被点击时回调
getSceneString获取当前列表场景:
"tab_list" - 分类tab
"merge_list" - 全部tab

实现时,首先定义搜索结果数据类型,包装自己的搜索结果,在search接口返回。

Kotlin
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:

Kotlin
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("自定义点击事件")
    }
}

同样,最后需要完成注册对应气泡实现

Kotlin
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即可。

代码示例
Kotlin
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实现绘制,提供图片、标题、摘要等通用绘制需求。定义如下:

Kotlin
/**
 * 通用数据模型,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

属性类型说明
stableIdString唯一id
iconString图标
titleCharSequence标题
summaryCharSequence描述
titleHighlightKeysList<String>?标题 需要高亮的关键字集合
summaryHighlightKeysList<String>?描述 需要高亮的关键字集合

KIMExpSearchCommonTab为响应点击事件,可继承KIMExpSearchCommonTab

方法参数返回值说明
onItemClickeditemView: View
item: KIMSearchCommonItem
item 点击事件,通过 ISearchResultCommonData.typetype 匹配
代码示例

实现 KIMExpSearchCommonTab,处理cell点击事件。

Kotlin
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注册。

Kotlin
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 支持在搜索标签栏右侧新增按钮,以实现自定义配置需求(如新增排序按钮),默认不显示,可通过实现扩展自行配置。

代码示例

Kotlin
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)
    }
}

注意扩展均需要注册才能生效:

Kotlin
override fun confMeatsOnBone(): KConf<Meat> {
    return kConfOf(
        ...
        KIMExpPageSearch::class.java confTo AppSearchPage::class.java
    )
}

搜索分类排序动态更新

为满足用户自定义搜索分类排序需求,搜索分类支持动态调整分类排序,并在本地缓存分类排序,注意:接口动态设置的将排序优先于初始化参数配置的TAB排序。

动态排序相关接口在KIMISdkSearchService中定义:

方法参数返回值说明
getSearchTabOrderListList<KIMSearchTab>
按显示顺序排序好的分类列表
获取当前排序后的搜索分类列表
updateSearchTabOrdernewOrderList: List<KIMSearchTab>
搜索分类顺序列表
按列表顺序更新搜索分类显示位置,更新后 SDK 会缓存该列表顺序,优先使用此列表位置显示搜索分类位置
注意:这里只影响排序,若设置的list内只包含部分搜索分类,不包含的搜索分类只会清除其排序设置

KIMSearchTab

属性类型说明
typeString搜索 tab 类型
nameString搜索 tab 名称
代码示例
Kotlin
val newItemList = adapter.items.toList() //自己UI修改后的排序
KIM.getService().getLinkUpService(KIMISdkSearchService::class.java)?.updateSearchTabOrder(newItemList)

具体可参考Demo示例。

‘全部’中单独配置分类

通过实现KIMExpSearchMergeSubItem扩展完成对应功能。

代码示例

Kotlin
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,并注册对应扩展实现。

Kotlin
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。

Kotlin
class AppSearchDivTitleItem(val title: String) : KIMBaseSearchResultItem(), ISearchItemNewGroup { ... }

class AppSearchDivTitleCell :KIMExpSearchBaseCell<AppSearchDivTitleView, AppSearchDivTitleItem>() { ... }

其他说明

  1. TAB页面状态配置:KIMSearchPageConfig

WOASDK支持对搜索页面的loading、empty、error状态进行配置,可按需求针对全局或单独配置:

KIMSearchPageConfig

属性类型说明
emptyLayoutResInt?
@LayoutRes
空结果时显示的layout
loadingLayoutResInt?
@LayoutRes
搜索过程中显示的layout
errorLayoutResInt?
@LayoutRes
错误情况下显示的layout
errorRetryIdInt?
@IdRes
若错误的layout,需要重试按钮,可配置此id,点击重试

WOASDK 有默认的状态效果,支持不同程度地修改配置:

修改全部的默认效果,可通过KIMCfgSearchConfig#defaultPageConfig配置所有tab的默认情况。修改自己新增TAB的效果,在KIMExpSearchTab重写pageConfig()返回需要的配置。修改内置的TAB的效果,通过KIMCfgSearchConfig#searchTabConfigs#pageConfig实现。

  1. 关键字高亮说明

若自行绘制的搜索结果cell,关键字命中高亮需要接入方自行处理, SDK 提供了工具类实现文本高亮:com.kingsoft.kim.kit.search.util.KIMSearchUtil#highlightText

方法说明:

Kotlin
/**
  * 对数据字符串进行高亮
  *
  * @param source 源内容
  * @param targets 需要高亮的关键字集合
  * @param highlightColor 颜色
  */
fun highlightText(
    source: CharSequence,
    targets: List<String>?,
    highlightColor: Int = 0xFF417FF9.toInt()
): CharSequence

若使用 SDK 内置的气泡实现,可以通过ISearchResultCommonData对应的方法实现。

Kotlin
 /**
    * 标题 需要高亮的关键字集合
    */
  val titleHighlightKeys: List<String>?
      get() = null

  /**
    * 描述 需要高亮的关键字集合
    */
  val summaryHighlightKeys: List<String>?
      get() = null

或者自行处理,在title/summary直接返回对应的SpannableString即可。

  1. 分割线处理

SDK 列表默认为每个item都绘制了分割线,若不需要 SDK 的分割线,在自己的ItemView 绘制,数据包装类实现 com.kingsoft.kim.kit.search.ex.ISearchItemNoDivider即可。示例:

Kotlin
class AppTitleSummaryItem(val id: String, val title: CharSequence, val summary: CharSequence) : KIMBaseSearchResultItem(), ISearchResultNoDivider

注意在布局中自行处理分割线,可以参考 WOASDKDemo。

  1. 排除不需要显示在 '全部' 结果列表的Item

非自定义搜索分类页面,且KIMExpSearchTab#showInMerge返回true的情况下,默认会将首页搜索结果前三项转发到'全部'列表显示,若分类列表自己处理了类似分组等形式,或不希望某个类型的ITEM不在'全部'列表显示,将该类型实现ISearchItemExcludeInMerge即可。

Kotlin
//这里声明不使用默认分割线,需要自己在ItemView绘制
//声明不这个类型不需要显示在 全部 列表
class AppGroupNameItem(val name: String) : KIMBaseSearchResultItem(), ISearchItemNoDivider, ISearchItemExcludeInMerge

具体可参考WOASDKDemo示例。