在BrowseFragment中为每个Header提供多个ListRow - Leanback库

10
我正在为我们的应用程序启用Leanback支持。根据UI要求,我需要添加多个列表行,对应每个标题,就像Youtube在Android TV上所做的那样。默认的ListRowPresenter似乎只呈现一个列表行及其标题。是否有支持多个列表行的presenter可用?我的想法是创建一个自定义的presenter,并在每个项目中嵌入RowsFragment,请纠正我如果这种方法有误。

只是一条提示 - 你可能想查看我下面的答案。最新版本的Leanback解决了这个问题:https://dev59.com/sl0Z5IYBdhLWcg3wrByH#37800789 - Kyle Venn
2个回答

20

Leanback团队最近在库的版本24.0.0中添加了对一个HeaderItem的多个ListRow支持。这使您能够提供一个映射到HeaderItem的RowsFragment。在他们的Leanback展示中,您可以看到它的示例。特别地,在这里是提供示例的文件。

现在有一个新的PageRowFragmentFactory,您需要在BrowseFragment中使用它来指定哪些片段映射到哪些HeaderItems。像这样:

    @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));
    }

你可以直接让上述方法返回一个RowsFragment的实例,这样就会得到包含多个ListRow映射到一个HeaderItemRowsFragment

现在,你只需在Gradle文件中添加以下行,即可通过Leanback的24.0.0版本获取此功能:

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

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

在Leanback的版本24.0.0中还有很多其他非常酷的东西,比如时髦的转换动画和更干净的API。它们都可以在我上面提供链接的示例项目中找到。此外,还有来自Google I/O的演讲介绍了更多新功能的内容。


@Kyle Venn:我按照上面的示例项目做了同样的事情,但搜索按钮没有自动隐藏。(图片:https://i.imgur.com/mCeCj0o.png)你能帮我吗? - MrSiro
1
@MrSiro,我很乐意帮你看一下 - 但如果我能看到你的代码,那么我会更有帮助。你可以在 Stack Overflow 上打开一个新的问题,并提供给我链接吗?隐藏和显示是通过 BrowseFragmentTitleView 进行通信实现的。这应该都可以自动完成。 - Kyle Venn
1
@KyleVenn:我已经解决了问题,谢谢。你能帮我们看一下这个错误吗:https://stackoverflow.com/questions/48576744/android-tv-searchfragment-error-speechrecognizer - MrSiro

7

有没有支持多个列表行的演示文稿?

据我所知,没有。问题在于BrowseFragment仅接受子类为Row的对象。因此,每个BrowseFragment条目中只能有单个行(以及其各自的标题)。

我正在考虑创建一个自定义演示文稿,其中每个项目都嵌入了RowsFragment,如果我的方法不正确,请纠正我。

正如我刚才提到的,我怀疑创建一个自定义演示文稿是没有帮助的。

我迄今为止唯一想到的解决方案就是创建一个自定义版本的BrowseFragment(通过手动扩展RowsFragmentHeadersFragment类),使其支持任何类型的碎片。

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

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

我正在考虑编写一个库,以简化使用这个自定义组件的过程。

完美,你指出了我的问题的解决方案。喜欢你所有的Android TV文章,为我节省了大量的源代码检查时间。 - CodeFury
Dextor,如果您有任何关于创建具有不同UI(两个标题项)的自定义详细信息片段的建议,将非常有帮助。 - Krishnakant

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