Skip to content

Instantly share code, notes, and snippets.

@mahdiPourkazemi
Last active August 4, 2025 14:11
Show Gist options
  • Save mahdiPourkazemi/2752ac97305a277da3928e23c47d2a04 to your computer and use it in GitHub Desktop.
Save mahdiPourkazemi/2752ac97305a277da3928e23c47d2a04 to your computer and use it in GitHub Desktop.
SAM applications in android
// ========== روش 1: استفاده از Interface ==========
fun interface OnItemClickListener {
fun onItemClick(item: String)
companion object {
fun withLogging(
tag: String = "ListItemClick",
messagePrefix: String = "Clicked on: ",
action: (String) -> Unit
): OnItemClickListener {
return OnItemClickListener { item ->
Log.d(tag, "$messagePrefix$item")
action(item)
}
}
}
}
@Composable
fun ItemListWithInterface(items: List<String>, listener: OnItemClickListener) {
LazyColumn {
items(items) { item ->
ListItemWithInterface(item, listener)
}
}
}
@Composable
fun ListItemWithInterface(item: String, listener: OnItemClickListener) {
Text(
text = item,
modifier = Modifier
.fillMaxWidth()
.clickable { listener.onItemClick(item) }
.padding(16.dp)
)
}
@Composable
fun MainScreenWithInterface() {
val items = listOf("Kotlin", "Compose", "Coroutines", "ViewModel")
val itemClickListener = OnItemClickListener.withLogging { item ->
// واکنش سفارشی
println("Custom action for: $item")
}
ItemListWithInterface(items, itemClickListener)
}
// ========== روش 2: استفاده از Lambda (روش مرسوم‌تر) ==========
@Composable
fun ItemListWithLambda(
items: List<String>,
onItemClick: (String) -> Unit
) {
LazyColumn {
items(items) { item ->
ListItemWithLambda(item, onItemClick)
}
}
}
@Composable
fun ListItemWithLambda(
item: String,
onItemClick: (String) -> Unit
) {
Text(
text = item,
modifier = Modifier
.fillMaxWidth()
.clickable { onItemClick(item) }
.padding(16.dp)
)
}
@Composable
fun MainScreenWithLambda() {
val items = listOf("Kotlin", "Compose", "Coroutines", "ViewModel")
ItemListWithLambda(items) { item ->
Log.d("ListItemClick", "Clicked on: $item")
// واکنش سفارشی
println("Custom action for: $item")
}
}
// ========== روش 3: Lambda با Higher-Order Function برای Logging ==========
fun withLogging(
tag: String = "ListItemClick",
messagePrefix: String = "Clicked on: ",
action: (String) -> Unit
): (String) -> Unit {
return { item ->
Log.d(tag, "$messagePrefix$item")
action(item)
}
}
@Composable
fun MainScreenWithLambdaAndLogging() {
val items = listOf("Kotlin", "Compose", "Coroutines", "ViewModel")
val clickHandler = withLogging { item ->
println("Custom action for: $item")
}
ItemListWithLambda(items, clickHandler)
}
// ========== مثال کاربرد پیشرفته‌تر با Lambda ==========
@Composable
fun AdvancedItemList(
items: List<String>,
onItemClick: (String) -> Unit = {},
onItemLongClick: (String) -> Unit = {},
onItemDelete: (String) -> Unit = {}
) {
LazyColumn {
items(items) { item ->
AdvancedListItem(
item = item,
onItemClick = onItemClick,
onItemLongClick = onItemLongClick,
onItemDelete = onItemDelete
)
}
}
}
@Composable
fun AdvancedListItem(
item: String,
onItemClick: (String) -> Unit,
onItemLongClick: (String) -> Unit,
onItemDelete: (String) -> Unit
) {
Row(
modifier = Modifier
.fillMaxWidth()
.clickable { onItemClick(item) }
.padding(16.dp),
horizontalArrangement = Arrangement.SpaceBetween
) {
Text(
text = item,
modifier = Modifier
.weight(1f)
.pointerInput(Unit) {
detectTapGestures(
onLongPress = { onItemLongClick(item) }
)
}
)
IconButton(onClick = { onItemDelete(item) }) {
Icon(Icons.Default.Delete, contentDescription = "Delete")
}
}
}
@Composable
fun AdvancedMainScreen() {
val items = remember { mutableStateListOf("Kotlin", "Compose", "Coroutines", "ViewModel") }
AdvancedItemList(
items = items,
onItemClick = { item ->
Log.d("ItemClick", "Clicked: $item")
},
onItemLongClick = { item ->
Log.d("ItemLongClick", "Long clicked: $item")
},
onItemDelete = { item ->
items.remove(item)
Log.d("ItemDelete", "Deleted: $item")
}
)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment