Android TV RecyclerView焦点交互

Android TV RecyclerView焦点交互,android,android-recyclerview,android-tv,Android,Android Recyclerview,Android Tv,我目前正在使用常规的RecyclerView和GridLayoutManager以及不同的spanCount,具体取决于Android电视应用程序的viewType。一切都很正常,但我有两个问题: 如果长时间按下dpad在项目之间快速滚动,有时焦点会丢失到不是RecyclerView子视图的视图 如何让RecyclerView将当前聚焦视图保持在网格的中心 使用LeanBack库中的垂直网格视图似乎可以解决列出的问题,但它使用的布局管理器是内部的,不支持spanCount,在使用d-pad导航时

我目前正在使用常规的
RecyclerView
GridLayoutManager
以及不同的
spanCount
,具体取决于Android电视应用程序的
viewType
。一切都很正常,但我有两个问题:

  • 如果长时间按下dpad在项目之间快速滚动,有时焦点会丢失到不是RecyclerView子视图的视图
  • 如何让
    RecyclerView
    将当前聚焦视图保持在网格的中心

  • 使用
    LeanBack
    库中的
    垂直网格视图
    似乎可以解决列出的问题,但它使用的
    布局管理器
    是内部的,不支持
    spanCount

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

    这是解决这个问题的方法

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


    因此,也许这个解决方案可以解决您的问题,或者让您了解如何解决您的问题。

    回收器视图适用于android TV。可能的解决方案包括:

    1.将focusable和focusableInTouchode添加到视图中。通过代码添加focusListner,并在每次单击视图时请求焦点

    2.要使“回收者视图”焦点项目位于中心,您必须覆盖布局管理器,如本例所示

    使用layoutManager。滚动TopositionWithOffset(位置,偏移),其中以位置为中心的视图位置和偏移是回收器视图宽度/2

  • 对于常规的
    回收视图

    • 我必须指定:
      android:genderantfocusability=“beforesanders”

    • 而且
      android:nextFocusDown=“@+id/recyclererviewid”
      设置为将焦点发送到RV本身

  • 我看到的唯一解决方案是使用按键侦听器选择要定位的项目
    currentPosition+spancount


  • 谢谢你的回复,但我已经读到了这些答案<如果向下滚动,我正在使用的代码>v24.2.0
    将跳转到正确的列。我遇到的主要两个问题是:1)我需要在列表中居中显示新的聚焦视图(此时,当您滚动时,布局管理器会创建新视图并进行滚动,使其完全可见,但我需要在RecyclerView中居中显示)。2) 如果你滚动得很快,如果layoutManager没有足够快地找到新视图(或者我不太清楚为什么会这样),那么焦点会跳到RecyclerView顶部的视图。leanback的
    VerticalGridView
    似乎解决了我的问题,但不幸的是,它使用的layoutManager是包保护的(我无法访问任何与此相关的内容;我可以复制源代码,但我不喜欢这个想法)+它不支持
    setPansizeLookup
    。使用它的唯一方法是将其用作
    列表视图
    +单元格
    GridLayout
    ,因此它看起来像一个网格。实现似乎很好,但我要求另一个更优雅的解决方案(或定制)。我没有为此找到任何LIB/Lead。我当前使用的另一个选项是此处的DPad感知回收器视图。它可以很好地处理焦点,但按钮混搭不如leanback库中的好,但它是开源的,您可以修改并贡献给它。@kingargyle感谢您的提示。我尝试了这个示例我也同意,它不如leanback LIB好,但似乎比常规的recyclerview做得更好。目前我使用leanback库
    VerticalGridView
    作为一个简单的列表,似乎工作得还不错。我仍然不喜欢它,另外一个缺点是,
    recyclerview
    默认项目更改动画不会“不是开箱即用的。啊哈,我也遇到了这个问题。谢谢你的回答。最后,我使用了leanback库中的
    VerticalGridView
    ,但似乎你的解决方案应该能起作用。最受欢迎的是。VerticalGridView或扩展RowFragment也可以让你达到与recycler视图相同的效果,但缺点是你自己。”无法按您想要的方式自定义。回答第一个问题,请查看@Tepes我正在使用回收器视图,但我没有获得焦点。请告诉我如何获得回收器视图的焦点