Фокус петли в RecylerView для ТВ - PullRequest
0 голосов
/ 07 ноября 2019

в соответствии с 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, что не очень подходит

...