Dies ist eine häufige Funktion in Anwendungen die es Benutzern ermöglichen, mithilfe einer Suchleiste eine Liste zu durchsuchen und passende Ergebnisse zurückzugeben. Die Zeichen innerhalb des Listenelements, die mit dem in eine Suchleiste eingegebenen Text übereinstimmen, haben eine andere Farbe als die Zeichen, die nicht übereinstimmen.
Das einzige Problem ist, dass ich es nicht ganz kann Erfahren Sie, wie Sie diese Funktion richtig implementieren. Ich habe eine Funktion entwickelt, die diesem Ziel sehr nahe kommt, aber ein wenig hinterherhinkt.
Hier ist der Code für das, was ich bisher erreicht habe.
Code: Select all
val searchValue by remember {mutableStateOf(TextFieldValue(""))}
val nameList = listOf("John", "Brittany", "Rick", "Jill", "Eric", "Alex", "Aaron")
Scaffold(
topBar = {
// SEARCH BAR; THE LIST IS RECOMPOSED ON EVERY INPUT
TextField(
value = searchValue,
onValueChange = {
searchValue = it
nameList.filter { it.contains(searchValue.text, ignoreCase = true) }
})
}
) {padding ->
LazyColumn(
modifier = Modifier.padding(padding)
) {
// DISPLAYED LIST OF MATCHING NAMES
items(if (searchValue.text.isEmpty()) emptyList() else nameList.filter { it.contains(searchValue.text, ignoreCase = true) }) { name ->
Text(
// ANNOTATED STRING THAT PARSES EACH CHARACTER IN A LIST ITEM
buildAnnotatedString {
name.forEach { letterInName ->
// IF THE CHARACTER MATCHES THEN THE TEXT CHANGES TO BLUE
if (letterInName.toString() in searchValue.text) {
withStyle(style = SpanStyle(color = Color.Blue)) { append(letterInName.toString()) }
// ELSE BLACK
} else {
withStyle(style = SpanStyle(color = Color.Black)) { append(letterInName.toString()) }
}
}
}
)
}
}
}
Zum Beispiel im Namen „Jill " Beide „L“ werden hervorgehoben, auch wenn nur ein „L“ in der Suchleiste vorhanden ist. Das gleiche Problem tritt mit dem „A“ in „Aaron“ auf. Beide werden hervorgehoben, unabhängig davon, wie viele sich in der Suchleiste befinden.
Wie kann ich dieses Problem beheben? Stellen Sie sicher, dass nur die Zahl eines bestimmten in die Suchleiste eingegebenen Zeichens hervorgehoben wird.
Vielen Dank, dass Sie sich die Zeit genommen haben, diese Frage zu lesen.