Подтвердить что ты не робот

Android TV RecyclerView фокусное взаимодействие

В настоящее время я использую обычный RecyclerView с GridLayoutManager с разным spanCount в зависимости от viewType для приложения Android TV. Все работает прилично, но у меня есть 2 вопроса:

  • Если вы долго нажимаете кнопку dpad вниз для быстрой прокрутки между элементами, иногда фокус теряется для представления, которое не является дочерним элементом RecyclerView.
  • Как я могу сказать RecyclerView сохранить текущий сфокусированный вид в центре сетки?

Кажется, что перечисленные проблемы фиксированы с помощью библиотеки VerticalGridView from LeanBack, но используемая LayoutManger внутренняя и не поддерживает spanCount.

4b9b3361

Ответ 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

  1. Для обычного RecyclerView,

    • Я должен был указать: android:descendantFocusability="beforeDescendants"

    • А также android:nextFocusDown="@+id/recyclerviewId" настроен на отправку фокуса на сам RV.

  2. Единственное решение, которое я вижу, это ключевой слушатель для выбора элемента для позиционирования currentPosition + spancount.