Android TV RecyclerView 焦点交互

36

我目前在使用普通的RecyclerView,通过为Android TV应用程序使用不同的viewType ,并使用具有不同spanCountGridLayoutManager。一切工作正常,但我有两个问题:

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

看起来,使用LeanBack库中的VerticalGridView可以解决上述问题,但它使用的LayoutManager是内部的,不支持spanCount


回答第一个问题,请查看此帖子 - yoAlex5
@Tepes 我正在使用 Recycler View,但是我无法获得焦点,请问你能告诉我如何在 Recycler View 上获取焦点吗? - Nikhil Singh
3个回答

4
  1. 对于普通的RecyclerView

    • 我需要指定:android:descendantFocusability="beforeDescendants"

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

  2. 我所看到的唯一解决方案是使用键盘监听器来选择项目并将其定位到currentPosition + spancount


在我的情况下不起作用,我正在使用AndroidX RecyclerView。 - Md Imran Choudhury

3

Recycler View在Android TV上可以很好地工作。你可以考虑以下解决方案:

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

2.要将Recycler View的焦点项保持在中心位置,您需要覆盖layout manager,就像这个例子一样。

RecyclerView smoothScroll到中心位置。android

或者

使用layoutManager.scrollToPositionWithOffset(position,offset)函数,其中position是焦点视图的位置,offset是recycler view宽度的一半。


感谢您的回答。最终我使用了来自Leanback库的VerticalGridView,但似乎您的解决方案也应该有效。 - Tepes Lucian
非常欢迎您。VerticalGridView或扩展RowFragment也可以让您实现与回收站视图相同的效果,但缺点是您无法像您想要的那样自定义它。 - Sharath kumar
我尝试按照您的指南操作,但对我没有用。如果您能分享一些带有思路的代码,那将更有帮助。 - Md Imran Choudhury

0

您可以尝试检查此解决方法,以解决使用d-pad导航时RecycleView焦点滚动的错误

这是SO问题的链接。

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

因此,也许这个解决方法可以解决您的问题,或者给您解决问题的思路。


谢谢回复,但我已经阅读了那些答案。我正在使用的v24.2.0版本会在向下滚动时跳转到正确的列。我遇到的两个主要问题是:1)我需要新的聚焦视图居中显示在列表中(现在随着您滚动,布局管理器创建新视图并滚动,以便它完全可见,但我需要它居中在RecyclerView中)。2)如果您快速滚动,则如果布局管理器无法快速找到新视图(或者我不太确定为什么会出现这种情况),则焦点会跳转到RecyclerView顶部的视图。 - Tepes Lucian
VerticalGridView从leanback似乎可以解决我的问题,但不幸的是它使用的layoutManager是包保护的(我无法访问任何关于它的内容;我可以复制源代码,但我不喜欢这个想法)+它不支持setSpanSizeLookup。唯一的方法是将其用作ListView +单元格GridLayout,以便它看起来像网格。实现似乎很好,但我正在寻求另一个更优雅的解决方案(或自定义解决方案)。我没有找到任何库/线索。 - Tepes Lucian
1
啊哈,我也遇到了这个问题。 - Zhang Xiang
@张翔 最终你用了什么方法?使用了leanback实现吗? - Tepes Lucian
这个不起作用,有人想出了解决方案吗? - niranjan kurambhatti
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接