如何使只有一行可见的 BrowseFragment

Posted

技术标签:

【中文标题】如何使只有一行可见的 BrowseFragment【英文标题】:How to make a BrowseFragment with only one row visible 【发布时间】:2015-08-18 05:55:16 【问题描述】:

如何制作像 YouTube 应用一样只有一行可见的 android TV BrowseFragment 界面?

这是我的代码的基本结构:

BrowseFragment browseFragment = BrowseFragment.getInstance();

browseFragment.setHeadersState(BrowseFragment.HEADERS_ENABLED);
browseFragment.setTitle(getString(R.string.AplicationName));
browseFragment.setBadgeDrawable(ContextCompat.getDrawable(this, R.drawable.badge));

ArrayObjectAdapter rowsAdapter = new ArrayObjectAdapter(new ListRowPresenter());


for ( int i = 0; i < itemsCount; ++i ) 

    HeaderItem header = new HeaderItem(i, "Header" + items[i].title);
    ArrayObjectAdapter rowAdapter = new ArrayObjectAdapter(new CardPresenter());

    for ( int i = 0; i < subitemsCount; ++i ) 
        rowAdapter.add(subitems[i]);
    

    rowsAdapter.add(new ListRow(header, rowAdapter));




browseFragment.setAdapter(rowsAdapter);

这会生成左侧的所有标题,但不是一个可见的项目行,而是一个包含所有行的网格,就像示例应用程序一样:

【问题讨论】:

你会发现 BrowseFragment 类(包含在leanback 库中)有关于如何自定义 HeadersFragment 和 RowsFragment 的注释提示和说明。您必须扩展 MainFragmentAdapterRegistry 类。 【参考方案1】:

您可以使用此处提供的自定义 BrowseFragment 组件:https://github.com/dextorer/BuildingForAndroidTV

您将能够复制 YouTube 电视应用提供的 UI 结构。


更新

我编写了一个简单的库,它扩展了 Leanback 并提供了更精简(和可靠)的自定义。这里是:

Sofa

【讨论】:

***.com/questions/58609475/…,我该如何实现?【参考方案2】:

我所做的是扩展 ListRowPresenter 类(例如:ListVideosRowPresenter),并添加以下代码:

@Override
protected void onSelectLevelChanged(RowPresenter.ViewHolder holder) 
    super.onSelectLevelChanged(holder);

    if (vh.isSelected())
        vh.getGridView().setVisibility(View.VISIBLE);
     else 
        vh.getGridView().setVisibility(View.GONE);
    

然后,在 MainFragment 类上,当您创建适配器(HeadersAdapters 和 RowsAdapters)时,您必须使用您的扩展类:

mHeadersAdapter = new ArrayObjectAdapter(new ListVideosRowPresenter());

为了避免显示标题,(在 rowsFragment 上)我必须创建两个单独的适配器(一个用于 HeadersFragment,另一个用于 RowsFragment):

        HeaderItem categoryHeader = new HeaderItem(i, MovieList.MOVIE_CATEGORY[i]);
        CustomListRow headersRow = new CustomListRow(categoryHeader, listRowAdapter);
        //I pass null as the header, so no header will be displayed on the RowsFragment
        CustomListRow listRow = new CustomListRow(null, listRowAdapter, MovieList.MOVIE_CATEGORY[i]);
        mRowsAdapter.add(listRow);
        mHeadersAdapter.add(headersRow);

最后在 MainFragment 上写一个新的 setAdapter 方法(有两个参数):

public void setAdapter(ObjectAdapter adapterHeaders, ObjectAdapter adapterRows) 
    //this line sets the same adapter for both fragments (headers and rows)
    setAdapter(adapterRows);
    //this line sets the adapter for the HeadersFragment only
    getHeadersFragment().setAdapter(adapterHeaders);

【讨论】:

我想试试你的方法,但不是Leanback库中的ListRowPresenter类吗?你是如何扩展课程的?您是否必须再次反编译、编辑和重新编译? 嗨。几年前我写了这个答案。那时您(作为程序员)能够扩展这些类,也可以检查代码。 (只需站在他们上方,然后按 ctrl + 单击)祝你好运 恭喜你!我可以检查 ListRowPresenter 的代码,但由于它被锁定,我无法对其进行编辑。我前几天才开始android开发,所以我真的不明白如何扩展一个Leanback类。你打开一个新的java文件吗?如果是,我应该把这个文件放在哪里?在原来的 Leanback 库中? 好的,您必须编写一个扩展“ListRowPresenter”的新类并覆盖方法(只是上面答案中列出的方法)。如果您对如何扩展课程有疑问,只需在互联网上查看有很多考试。然后按照上面列出的其他步骤进行操作。亲爱的朋友! @SebastianCorradi,你能帮我解决这个问题吗? ***.com/q/67883215/4732846 谢谢。

以上是关于如何使只有一行可见的 BrowseFragment的主要内容,如果未能解决你的问题,请参考以下文章

如何使 Android ScrollView 褪色边缘始终可见?

QML:只有一行可见 TableView 与行和项目委托

如果仅单击五个影片剪辑(不是更多),如何使影片剪辑可见

无法刷新 BrowseFragment 中的数据

在 BrowseFragment 中禁用行缩放/展开

即使自定义图例单击以使其不可见,如何在折线图中至少显示一行