【问题标题】:Android TV RecyclerView focus interactionAndroid TV RecyclerView焦点交互
【发布时间】:2017-01-07 22:46:12
【问题描述】:

我目前正在使用普通的 RecyclerViewGridLayoutManager 以及不同的 spanCount 依赖于 viewType 的 Android TV 应用程序。一切正常,但我有两个问题:

  1. 如果您长按 dpad 在项目之间快速滚动,有时焦点会丢失到不是 RecyclerView 子视图的视图。
  2. 如何告诉RecyclerView 将当前焦点视图保持在网格中心?

似乎列出的问题已通过使用来自LeanBack 库的VerticalGridView 得到修复,但它使用的LayoutManger 是内部的,不支持spanCount

【问题讨论】:

  • 回答第一个问题请看post
  • @Tepes 我正在使用 Recycler View,但我没有获得焦点,请你告诉我如何专注于 recycler view

标签: android android-recyclerview android-tv


【解决方案1】:

Recycler 视图适用于 android TV。您可以包括的可能解决方案是:

1.给view添加focusable和focusableInTouchode。通过代码添加focusListner,每次点击view时请求焦点。

2. 要将 Recycler View 焦点项目保持在中心,您必须像此示例一样覆盖布局管理器。

RecyclerView smoothScroll to position in the center. android

使用 layoutManager.scrollToPositionWithOffset(position,offset) 其中以位置为中心的视图位置和偏移量是回收器视图宽度/2。

【讨论】:

  • 感谢您的回答。最后,我使用了来自leanback 库的VerticalGridView,但您的解决方案似乎应该可以工作。
  • 欢迎您。VerticalGridView 或扩展 RowFragment 也可以让您达到与回收站视图相同的效果,但缺点是您无法按照自己想要的方式自定义它。
【解决方案2】:
  1. 对于普通的RecyclerView

    • 我必须指定:android:descendantFocusability="beforeDescendants"

    • 而且android:nextFocusDown="@+id/recyclerviewId" 也设置为将焦点发送到 RV 本身。

  2. 我看到的唯一解决方案是关键侦听器选择要定位的项目currentPosition + spancount

【讨论】:

    【解决方案3】:

    您可以尝试在使用 d-pad 导航时使用RecycleView 焦点滚动检查workaroundbug

    这是SO question

    这里的问题是GridLayoutManager 使用LinearLayoutManageronFocusSearchFailed() 实现,当焦点接近RecyclerView 的内边界时调用。 LinearLayoutManager's 实现只提供第一个/最后一个(取决于滚动方向)元素。因此焦点跳转到新行的第一个/最后一个元素。

    所以,也许这种解决方法可以解决您的问题或让您了解如何解决问题。

    【讨论】:

    • 感谢您的回复,但我已经阅读了这些答案。 v24.2.0 如果您向下滚动,我正在使用跳转到正确的列。我遇到的主要 2 个问题是:1)我需要新的聚焦视图在列表中居中(现在当您滚动布局管理器时,会创建新视图并滚动以使其完全可见,但我需要它是以 RecyclerView 为中心)。 2)如果你滚动得非常快,如果 layoutManagers 未能足够快地找到新视图(或者我不太确定为什么会这样),焦点会跳转到 RecyclerView 顶部的视图。
    • VerticalGridView 来自leanback 似乎解决了我的问题,但不幸的是,它使用的 layoutManager 是包保护的(我无法访问任何相关内容;我可以复制源代码,但我不喜欢想法)+它不支持setSpanSizeLookup。使用它的唯一方法是作为ListView + 一个单元格GridLayout,所以它看起来像一个网格。该实现似乎运行良好,但我要求另一种更优雅的解决方案(或自定义解决方案)。我没有为此找到任何库/线索。
    • 我目前使用的另一个选项是 A DPad Aware Recycler View from here。它可以很好地处理焦点,但按钮混搭不如leanback 库中的那么好,但它是开源的,您可以对其进行修改和贡献。 github.com/vganin/dpad-aware-recycler-view
    • @kingargyle 感谢您的提示。我尝试了该示例,我同意它不如leanback libs,但似乎比常规recyclerview 做得更好。目前我正在使用leanback 库VerticalGridView 作为一个简单的列表,并且似乎工作得很好。我仍然不喜欢它,另外一个缺点是 RecyclerView 默认的项目更改动画不会开箱即用。
    • 啊哈,我也遇到了这个问题。
    猜你喜欢
    • 2020-10-11
    • 2021-01-02
    • 1970-01-01
    • 2018-08-27
    • 1970-01-01
    • 2016-05-14
    • 2022-10-15
    • 2020-10-13
    • 2016-10-09
    相关资源
    最近更新 更多