Android TV RecyclerView фокусное взаимодействие
В настоящее время я использую обычный RecyclerView
с GridLayoutManager
с разным spanCount
в зависимости от viewType
для приложения Android TV. Все работает прилично, но у меня есть 2 вопроса:
- Если вы долго нажимаете кнопку dpad вниз для быстрой прокрутки между элементами, иногда фокус теряется для представления, которое не является дочерним элементом RecyclerView.
- Как я могу сказать
RecyclerView
сохранить текущий сфокусированный вид в центре сетки?
Кажется, что перечисленные проблемы фиксированы с помощью библиотеки VerticalGridView
from LeanBack
, но используемая LayoutManger
внутренняя и не поддерживает spanCount
.
Ответы
Ответ 1
Recycler view отлично работает с Android-телефоном. Возможные решения:
1.add focusable и focusableInTouchode для просмотра. Добавьте focusListner через код и запросите фокус каждый раз при щелчке по просмотру.
2.Чтобы сохранить объект Recycler View сфокусированным в центре, вам необходимо переопределить менеджер компоновки точно так же, как в этом примере.
RecyclerView smoothScroll для размещения в центре. андроид
или
используйте layoutManager.scrollToPositionWithOffset(положение, смещение), где позиция положения с ориентацией положения и смещение - это ширина просмотра ресайклера/2.
Ответ 2
Вы можете проверить этот обходной путь для ошибка с RecycleView
скроллированием фокуса при навигации с помощью d-pad.
Вот SO вопрос для этого.
Проблема заключается в том, что GridLayoutManager
использует LinearLayoutManager
реализацию onFocusSearchFailed()
, которая вызывается, когда фокус приближается к внутренней границе RecyclerView
. LinearLayoutManager's
реализация только предлагает первый/последний (зависит от направления прокрутки). Следовательно, фокус переходит к первому/последнему элементу новой строки.
Итак, возможно, это решение поможет решить вашу проблему или дать вам представление о том, как решить вашу проблему.
Ответ 3
-
Для обычного RecyclerView
,
-
Единственное решение, которое я вижу, это ключевой слушатель для выбора элемента для позиционирования currentPosition + spancount
.