Как лучше сделать установку текста в View вместо прямого присваивания
Что проверяют
Знаете ли вы, почему textView.text = "Привет, " + name на ревью обычно не проходит и что делать вместо этого: ресурсы, форматирование, единый источник состояния. Следом часто спрашивают, во что обходится setText в длинном списке.
Как отвечать
Разложите ответ на три слоя: откуда берётся строка, как она ставится и кто решает, когда её ставить.
- ресурсы с плейсхолдерами:
<string name="greeting">Привет, %1$s</string>иgetString(R.string.greeting, name). Склейку подсвечивает Android Lint (SetTextI18n): переводчик не может переставить слова, а в других языках порядок другой; - множественное число:
resources.getQuantityString(R.plurals.items, count, count)вместоif (count == 1), в русском три формы, и правила знает система; - ловушка с числом:
setText(5)попадает в перегрузку с@StringRes, ищет ресурс с id 5 и падает сResources.NotFoundException; - стилизованный текст: спаны через
buildSpannedStringиз core-ktx илиHtmlCompat.fromHtmlдля разметки в ресурсе; - состояние: текст приходит из
StateFlowвоViewModelи собирается вrepeatOnLifecycle(Lifecycle.State.STARTED)или через Data Binding. Нет десятка мест, где экран меняет текст вручную.
Про производительность: при wrap_content каждый setText может запросить новый layout, поэтому в onBindViewHolder не ставят повторно тот же текст, а для длинных текстов есть PrecomputedTextCompat, который считает разметку вне главного потока. В Compose это Text(stringResource(R.string.greeting, name)), а неизменившиеся параметры не вызывают перерисовку.
Где спотыкаются
Рассказывают про TextWatcher. Это слушатель ввода в EditText, к тому, как правильно ставить текст, он отношения не имеет.
Считают в onBindViewHolder тяжёлое: парсят даты, собирают спаны на каждый бинд. Это готовят заранее в модели элемента списка.
Держат ссылку на TextView во ViewModel, чтобы ставить текст оттуда. При повороте экрана это утечка Activity: ViewModel отдаёт данные, а не управляет вьюхами.