制作 Android 电视菜单的最佳方法是什么?

What is the best way to make an Android TV menu?

我目前正在开发 Android 电视应用。我发现它具有挑战性,因为您不能只绘制一个列表并让用户通过触摸进行导航。当用户点击 Dpad 按钮时,您必须以编程方式滚动列表。

我想创建一个类似于 Android 电视“设置”屏幕中的菜单的列表。请观看视频 example

到目前为止,我使用的解决方案是创建水平 RecyclerView,当用户向右或向左点击方向键时更新。

所以在我的adapter中我有一个方法:

 public void incrementPosition() {
      if(currentSelection < getItemCount()) {
          previousSelection = currentSelection;
          notifyItemChanged(previousSelection);
          currentSelection++;
          notifyItemChanged(currentSelection);
      }
 }

然后当 onBindViewHolder 被调用时,我有类似的东西:

if(position == currentSelection) {
         //draw item to look like it's selected
     }
     else if(position == previousSelection) {
        // draw item to look it's NOT selected
     }

这将使该项目看起来已被选中,但列表不会随着新选择一起滚动。

recentlyAddedRecyclerView.smoothScrollToPosition(currentSelection + 2)

(是的,我知道 currentSelection + 2 可以超出列表,我在那里有一些 if 语句)

结果与上面发布的视频类似。但是,它并不像我希望的那样 "snappy"。我只是想确保这是实现它的最佳方式。

这是来自网络调用的动态列表。所以我不能只用静态视图制作布局。

v17.leanback.app 库是实现此目的的方法 - 这就是您的视频中使用的方法。如果您使用 auto-generated Android Studio TV Activity 创建一个新的 TV-only Android Studio 项目,它将为您提供一个很好的起点 header 行、自定义等

以防万一:

  1. Android Studio > File > New Project > name it & click Next
  2. Only select the TV Platform then click Next
  3. Select "Android TV Activity" then click Next

您会关心 MainFragmentCardPresenter。将 BrowseFragment 视为您用行填充的列表视图。行中填满 built-upon FrameLayouts 的卡片。 RecyclerView 已经集成到 leanback 中...我发现我必须花费大量时间来自定义它们,正如您所指出的那样,并且只是尝试 find/navigate 相关的在线文档。祝你好运。