
A-Z grouped contact list with sticky section headers, right-side alphabet index bar and draggable floating cursor; highly customizable builders and optional leading/trailing list slots.
A Compose Multiplatform library that ports the contact_list_view Flutter package. It provides an A-Z grouped contact list with sticky section headers, a right-side alphabet index bar, and a floating cursor while dragging.
Repository: github.com/Matkurban/ContactListView
| ScreenShot | ScreenShot |
|---|---|
![]() |
![]() |
# sorted laststickyHeaderBuilder, cursorBuilder, index bar style buildersstartContent / endContent — leading and trailing lazy list slots| Platform | Target |
|---|---|
| Android | minSdk 24 |
| iOS | Arm64, Simulator Arm64 |
| Desktop | JVM |
| Web | JS, Wasm |
Add to your gradle/libs.versions.toml:
[versions]
contactlistview = "1.0.0"
[libraries]
contactlistview = { module = "io.github.matkurban:contactlistview", version.ref = "contactlistview" }Then in build.gradle.kts:
kotlin {
sourceSets {
commonMain.dependencies {
implementation(libs.contactlistview)
}
}
}Alternatively, add the dependency directly to your commonMain source set:
// build.gradle.kts
kotlin {
sourceSets {
commonMain.dependencies {
implementation("io.github.matkurban:contactlistview:1.0.0")
}
}
}Import from io.github.matkurban.contactlistview.*.
import androidx.compose.material3.ListItem
import androidx.compose.material3.Text
import io.github.matkurban.contactlistview.ContactListView
data class Contact(val name: String)
ContactListView(
contactsList = contacts,
tag = { contact ->
val first = contact.name.firstOrNull()?.uppercaseChar() ?: '#'
if (first in 'A'..'Z') first.toString() else "#"
},
sticky = true,
startContent = {
item { ListItem(headlineContent = { Text("New friends") }) }
},
endContent = {
item { ListItem(headlineContent = { Text("Total ${contacts.size} contacts") }) }
},
itemBuilder = { contact ->
ListItem(headlineContent = { Text(contact.name) })
},
)| API | Description |
|---|---|
stickyHeaderBuilder |
Custom section header; receives tag and isPinned
|
cursorBuilder |
Custom floating cursor while dragging the index bar |
indexBarBoxDecorationBuilder |
Style index bar item background per selection state |
indexBarTextStyleBuilder |
Style index bar item text per selection state |
stickyHeaderBoxDecorationBuilder |
Style sticky header background per pinned state |
stickyHeaderTextStyleBuilder |
Style sticky header text per pinned state |
startContent / endContent
|
Extra lazy list items before/after grouped contacts |
This repository includes demo apps for each platform:
| Module | Description |
|---|---|
sample |
Shared demo UI (App, ContactScreen, etc.) |
androidApp |
Android sample shell |
desktopApp |
JVM desktop app via Compose Desktop |
webApp |
Browser app (Wasm) |
Run the samples:
./gradlew :androidApp:assembleDebug
./gradlew :desktopApp:run
./gradlew :webApp:wasmJsBrowserDevelopmentRun
./gradlew :contactlistview:jvmTestcontactlistview — published library (100% commonMain)sample — demo UI (not published)androidApp / desktopApp / webApp — sample appsThis project is licensed under the MIT License.
A Compose Multiplatform library that ports the contact_list_view Flutter package. It provides an A-Z grouped contact list with sticky section headers, a right-side alphabet index bar, and a floating cursor while dragging.
Repository: github.com/Matkurban/ContactListView
| ScreenShot | ScreenShot |
|---|---|
![]() |
![]() |
# sorted laststickyHeaderBuilder, cursorBuilder, index bar style buildersstartContent / endContent — leading and trailing lazy list slots| Platform | Target |
|---|---|
| Android | minSdk 24 |
| iOS | Arm64, Simulator Arm64 |
| Desktop | JVM |
| Web | JS, Wasm |
Add to your gradle/libs.versions.toml:
[versions]
contactlistview = "1.0.0"
[libraries]
contactlistview = { module = "io.github.matkurban:contactlistview", version.ref = "contactlistview" }Then in build.gradle.kts:
kotlin {
sourceSets {
commonMain.dependencies {
implementation(libs.contactlistview)
}
}
}Alternatively, add the dependency directly to your commonMain source set:
// build.gradle.kts
kotlin {
sourceSets {
commonMain.dependencies {
implementation("io.github.matkurban:contactlistview:1.0.0")
}
}
}Import from io.github.matkurban.contactlistview.*.
import androidx.compose.material3.ListItem
import androidx.compose.material3.Text
import io.github.matkurban.contactlistview.ContactListView
data class Contact(val name: String)
ContactListView(
contactsList = contacts,
tag = { contact ->
val first = contact.name.firstOrNull()?.uppercaseChar() ?: '#'
if (first in 'A'..'Z') first.toString() else "#"
},
sticky = true,
startContent = {
item { ListItem(headlineContent = { Text("New friends") }) }
},
endContent = {
item { ListItem(headlineContent = { Text("Total ${contacts.size} contacts") }) }
},
itemBuilder = { contact ->
ListItem(headlineContent = { Text(contact.name) })
},
)| API | Description |
|---|---|
stickyHeaderBuilder |
Custom section header; receives tag and isPinned
|
cursorBuilder |
Custom floating cursor while dragging the index bar |
indexBarBoxDecorationBuilder |
Style index bar item background per selection state |
indexBarTextStyleBuilder |
Style index bar item text per selection state |
stickyHeaderBoxDecorationBuilder |
Style sticky header background per pinned state |
stickyHeaderTextStyleBuilder |
Style sticky header text per pinned state |
startContent / endContent
|
Extra lazy list items before/after grouped contacts |
This repository includes demo apps for each platform:
| Module | Description |
|---|---|
sample |
Shared demo UI (App, ContactScreen, etc.) |
androidApp |
Android sample shell |
desktopApp |
JVM desktop app via Compose Desktop |
webApp |
Browser app (Wasm) |
Run the samples:
./gradlew :androidApp:assembleDebug
./gradlew :desktopApp:run
./gradlew :webApp:wasmJsBrowserDevelopmentRun
./gradlew :contactlistview:jvmTestcontactlistview — published library (100% commonMain)sample — demo UI (not published)androidApp / desktopApp / webApp — sample appsThis project is licensed under the MIT License.