в соответствии с https://developer.android.com/training/tv/start/navigation
Вы должны установить порядок навигации в виде цикла, чтобы последний элемент управления направил фокус обратно на первый.
Я попытался реализовать такое поведение для RecyclerView
элементов:
fun RecyclerView.loopFocusVertically() {
viewTreeObserver.addOnGlobalLayoutListener {
val children = getAllChildren()
val firstFocusableItem = children.firstOrNull { it.isFocusable }
val lastFocusableItem = children.lastOrNull { it.isFocusable }
firstFocusableItem?.let { it.nextFocusUpId = lastFocusableItem?.id ?: it.id }
lastFocusableItem?.let { it.nextFocusDownId = firstFocusableItem?.id ?: it.id }
}
}
Поэтому при изменении макета я сделал первый вид, имеющий nextFocusUpId
ссылку на последний вид, и последний вид nextFocusDownId
, ссылку на первый вид,Но это работает только в том случае, если все виды фактически размещены на экране, что, очевидно, не соответствует действительности в общем случае. RecyclerView
фактически повторяет представления, поэтому последнее и первое представление могут не существовать одновременно на экране
Как реализовать цикл фокусировки для rv в режиме ожидания? Я пытался использовать androidx.leanback.widget.VerticalGridView
из библиотеки Leback, но он также не имеет требуемого поведения.
По умолчанию при нажатии вверх от первого фокусируемого элемента rv focus переходит к другому фокусируемому виду за пределами rv, что не очень подходит