Skip to content

Commit 9987d52

Browse files
committed
Add live search with FilterTextView example
1 parent fb654a9 commit 9987d52

File tree

1 file changed

+90
-0
lines changed
  • compose/snippets/src/main/java/com/example/compose/snippets/text

1 file changed

+90
-0
lines changed
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
package com.example.compose.snippets.text
2+
3+
import androidx.compose.foundation.layout.Column
4+
import androidx.compose.foundation.layout.fillMaxSize
5+
import androidx.compose.foundation.layout.fillMaxWidth
6+
import androidx.compose.foundation.layout.padding
7+
import androidx.compose.foundation.lazy.LazyColumn
8+
import androidx.compose.material3.ListItem
9+
import androidx.compose.material3.OutlinedTextField
10+
import androidx.compose.material3.Text
11+
import androidx.compose.runtime.Composable
12+
import androidx.compose.runtime.getValue
13+
import androidx.compose.runtime.mutableStateOf
14+
import androidx.compose.runtime.saveable.rememberSaveable
15+
import androidx.compose.runtime.setValue
16+
import androidx.compose.ui.Modifier
17+
import androidx.compose.ui.tooling.preview.Preview
18+
import androidx.compose.ui.unit.dp
19+
import androidx.lifecycle.ViewModel
20+
import androidx.lifecycle.viewmodel.compose.viewModel
21+
import androidx.lifecycle.compose.collectAsStateWithLifecycle
22+
import kotlinx.coroutines.flow.MutableStateFlow
23+
import kotlinx.coroutines.flow.StateFlow
24+
25+
26+
// [START android_compose_text_filtertextviewmodel]
27+
class FilterTextViewModel : ViewModel() {
28+
private val items = listOf(
29+
"Cupcake",
30+
"Donut",
31+
"Eclair",
32+
"Froyo",
33+
"Gingerbread",
34+
"Honeycomb",
35+
"Ice Cream Sandwich"
36+
)
37+
38+
private val _filteredItems = MutableStateFlow(items)
39+
var filteredItems: StateFlow<List<String>> = _filteredItems
40+
41+
fun filterText(input: String) {
42+
// This filter returns the full items list when input is an empty string.
43+
_filteredItems.value = items.filter { it.contains(input, ignoreCase = true) }
44+
}
45+
}
46+
// [END android_compose_text_filtertextviewmodel]
47+
48+
// [START android_compose_text_filtertextview]
49+
@Composable
50+
fun FilterTextView(modifier: Modifier = Modifier, viewModel: FilterTextViewModel = viewModel()) {
51+
val filteredItems by viewModel.filteredItems.collectAsStateWithLifecycle()
52+
var text by rememberSaveable { mutableStateOf("") }
53+
54+
Column(
55+
modifier = Modifier
56+
.fillMaxSize()
57+
.padding(all = 10.dp)
58+
) {
59+
OutlinedTextField(
60+
value = text,
61+
onValueChange = {
62+
text = it
63+
viewModel.filterText(text)
64+
},
65+
label = { Text("Filter Text") },
66+
modifier = Modifier.fillMaxWidth()
67+
)
68+
69+
LazyColumn {
70+
items(
71+
count = filteredItems.size,
72+
key = { index -> filteredItems[index] }
73+
) {
74+
ListItem(
75+
headlineContent = { Text(filteredItems[it]) },
76+
modifier = Modifier
77+
.fillParentMaxWidth()
78+
.padding(10.dp)
79+
)
80+
}
81+
}
82+
}
83+
}
84+
// [END android_compose_text_filtertextview]
85+
86+
@Preview(showBackground = true)
87+
@Composable
88+
private fun FilterTextViewPreview() {
89+
FilterTextView()
90+
}

0 commit comments

Comments
 (0)