Skip to main content
CometChatMessageHeader is a header bar component that sits at the top of a chat screen, displaying the avatar, name, and status of the user or group in the conversation.

Where It Fits

CometChatMessageHeader sits at the top of a chat screen. Wire it alongside CometChatMessageList and CometChatMessageComposer to build a complete messaging layout.
activity_chat.xml
<com.cometchat.uikit.kotlin.presentation.messageheader.ui.CometChatMessageHeader
    android:id="@+id/message_header"
    android:layout_width="match_parent"
    android:layout_height="56dp" />
val messageHeader = findViewById<CometChatMessageHeader>(R.id.message_header)
messageHeader.setUser(user)

Quick Start

Add to your layout XML:
<com.cometchat.uikit.kotlin.presentation.messageheader.ui.CometChatMessageHeader
    android:id="@+id/header"
    android:layout_width="match_parent"
    android:layout_height="56dp" />
Set a User or Group on the component — this is required for it to display data:
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.your_layout)

    val messageHeader = findViewById<CometChatMessageHeader>(R.id.header)
    messageHeader.setUser(user)
    // or messageHeader.setGroup(group)
}
Prerequisites: CometChat SDK initialized with CometChatUIKit.init(), a user logged in, and the UI Kit dependency added.

Actions and Events

Callback Methods

onBackPress

Fires when the user presses the back button in the header.
messageHeader.setOnBackPress {
    finish()
}

onError

Fires on internal errors (network failure, auth issue, SDK exception).
messageHeader.setOnError { exception ->
    Log.e("MessageHeader", "Error: ${exception.message}")
}

SDK Events (Real-Time, Automatic)

The component listens to these SDK events internally. No manual setup needed.
SDK ListenerInternal behavior
onUserOnline / onUserOfflineUpdates online/offline status indicator
onTypingStarted / onTypingEndedShows/hides typing indicator in subtitle
onGroupMemberJoined / onGroupMemberLeft / onGroupMemberKicked / onGroupMemberBannedUpdates group member count

Functionality

Method (Kotlin XML)Compose ParameterDescription
setUser(user)user = userDisplay a user’s header details
setGroup(group)group = groupDisplay a group’s header details
setBackButtonVisibility(View.VISIBLE)hideBackButton = falseToggle back button
setOnBackPress { }onBackPress = { }Back button callback

Custom View Slots

Leading View

Replace the avatar / left section.
messageHeader.setLeadingView(object : MessageHeaderViewHolderListener() {
    override fun createView(context: Context, user: User?, group: Group?): View {
        return ImageView(context).apply {
            layoutParams = ViewGroup.LayoutParams(48.dp, 48.dp)
        }
    }

    override fun bindView(context: Context, createdView: View, user: User?, group: Group?) {
        val imageView = createdView as ImageView
        // Load avatar image
    }
})

Subtitle View

Replace the subtitle text below the user’s or group’s name.
messageHeader.setSubtitleView(object : MessageHeaderViewHolderListener() {
    override fun createView(context: Context, user: User?, group: Group?): View {
        return TextView(context)
    }

    override fun bindView(context: Context, createdView: View, user: User?, group: Group?) {
        val textView = createdView as TextView
        if (user != null) {
            textView.text = user.status
        } else if (group != null) {
            textView.text = "${group.membersCount} members"
        }
    }
})

Trailing View

Replace the right section (action buttons).
messageHeader.setTrailingView(object : MessageHeaderViewHolderListener() {
    override fun createView(context: Context, user: User?, group: Group?): View {
        return ImageView(context).apply {
            setImageResource(R.drawable.save_icon)
            layoutParams = LinearLayout.LayoutParams(24.dp, 24.dp)
        }
    }

    override fun bindView(context: Context, createdView: View, user: User?, group: Group?) {
        // Bind trailing view data
    }
})

Item View

Replace the entire default header with a fully customized layout.
messageHeader.setItemView(object : MessageHeaderViewHolderListener() {
    override fun createView(context: Context, user: User?, group: Group?): View {
        return LayoutInflater.from(context).inflate(R.layout.custom_message_header, null)
    }

    override fun bindView(context: Context, createdView: View, user: User?, group: Group?) {
        val avatar = createdView.findViewById<CometChatAvatar>(R.id.avatar)
        val title = createdView.findViewById<TextView>(R.id.title)
        if (user != null) {
            avatar.setAvatar(user.name, user.avatar)
            title.text = user.name
        } else if (group != null) {
            avatar.setAvatar(group.name, group.icon)
            title.text = group.name
        }
    }
})

Style

Define a custom style in themes.xml:
themes.xml
<style name="CustomMessageHeaderStyle" parent="CometChatMessageHeaderStyle">
    <item name="cometchatMessageHeaderBackgroundColor">#FEEDE1</item>
    <item name="cometchatMessageHeaderTitleTextColor">#F76808</item>
</style>

<style name="AppTheme" parent="CometChatTheme.DayNight">
    <item name="cometchatMessageHeaderStyle">@style/CustomMessageHeaderStyle</item>
</style>
See Component Styling for the full reference.

ViewModel

val viewModel = ViewModelProvider(this)
    .get(CometChatMessageHeaderViewModel::class.java)
messageHeader.setViewModel(viewModel)
See ViewModel & Data for state observation and custom repositories.

Next Steps

Message List

Display messages in a conversation

Message Composer

Rich input for sending messages

Component Styling

Detailed styling reference

ViewModel & Data

Custom ViewModels and repositories