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
。一切都很正常,但我有两个问题:
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我正在使用回收器视图,但我没有获得焦点。请告诉我如何获得回收器视图的焦点