BrowseFragment 上每个 Header 的多个 ListRows - Leanback 库

Multiple ListRows for each Header on BrowseFragment - Leanback library

我开始为我们的应用程序提供 Leanback 支持。 根据 UI 的要求,我需要添加与每个 header 相对应的多个列表行,这与 Youtube 应用程序在 Android 电视上所做的完全一样。默认 ListRowPresenter 似乎只呈现一个列表行及其 header。是否有任何演示者支持多个列表行?我正在考虑创建一个自定义演示者,并在每个项目中嵌入 RowsFragment,如果我的方法有误,请纠正我。

Is there any presenter that supports multiple list rows?

据我所知没有。问题是 BrowseFragment 只接受 children 子类 Row。因此,BrowseFragment 中的每个条目只能有单行(及其各自的 headers)。

I'm thinking on the lines creating a custom presenter with RowsFragment embedded in each item, correct me if my approach is wrong.

正如我刚才提到的,我怀疑创建自定义演示者是否有帮助。

到目前为止我能想到的唯一解决方案就是简单地创建 BrowseFragment 的自定义版本(通过手动扩展 RowsFragmentHeadersFragment 类)以便它支持任何类型的片段。

如果你有兴趣,我写了一系列关于这个过程的文章 https://medium.com/building-for-android-tv/

和一个提供自定义版本 BrowseFragment 的基础项目 https://github.com/dextorer/BuildingForAndroidTV

我也在考虑编写一个库来简化这个自定义组件的使用。

Leanback 团队最近在库的 24.0.0 版本中为一个 HeaderItem 添加了对多个 ListRow 的支持。它允许您提供映射到 HeaderItemRowsFragment。您可以在他们的 Leanback showcase. Specifically, here 中看到它的示例,这是他们提供示例的文件。

您的 BrowseFragment 中需要一个新的 PageRowFragmentFactory,它指定哪些片段映射到哪些 HeaderItem。像这样:

    @Override
    public Fragment createFragment(Object rowObj) {
        Row row = (Row)rowObj;
        mBackgroundManager.setDrawable(null);
        if (row.getHeaderItem().getId() == HEADER_ID_1) {
            return new SampleFragmentA();
        } else if (row.getHeaderItem().getId() == HEADER_ID_4) {
            return new WebViewFragment();
        }
        throw new IllegalArgumentException(String.format("Invalid row %s", rowObj));
    }

您可以只使用上述方法 return 一个 RowsFragment 的实例,现在您将拥有包含多个 ListRow 映射的 RowsFragment一个 HeaderItem.

从现在开始,您可以通过 Leanback 的 24.0.0 版在您的 gradle 文件中使用以下行来访问此优点:

compile 'com.android.support:leanback-v17:24.0.0

您可能会收到警告,但现在可以安全地忽略它。

Leanback 24.0.0 版本中还有大量其他非常酷的东西,例如时髦的过渡动画和更简洁的 API。这些都可以在我上面链接的示例项目中找到。还有一个 talk from Google I/O 涵盖了更多的新增内容。