如何使只有一行可见的 BrowseFragment
How to make a BrowseFragment with only one row visible
如何制作一个 Android TV BrowseFragment 界面,只有一行可见,就像 YouTube 应用程序一样?
这是我的代码的基本结构:
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);
这会在左侧生成所有 headers,但我得到的不是一个可见的项目行,而是一个包含所有行的网格,如示例应用程序:
您可以使用此处提供的自定义 BrowseFragment 组件:https://github.com/dextorer/BuildingForAndroidTV
您将能够复制电视版 YouTube 应用提供的相同 UI 结构。
更新
我编写了一个简单的库,它扩展了 Leanback 并提供了更简化(和可靠)的定制。这是:
我所做的是扩展 ListRowPresenter class(例如: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 Class 上,当您创建适配器(HeadersAdapters 和 RowsAdapters)时,您必须使用扩展 class:
mHeadersAdapter = new ArrayObjectAdapter(new ListVideosRowPresenter());
为了避免显示 headers,(在 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);
}
如何制作一个 Android TV BrowseFragment 界面,只有一行可见,就像 YouTube 应用程序一样?
这是我的代码的基本结构:
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);
这会在左侧生成所有 headers,但我得到的不是一个可见的项目行,而是一个包含所有行的网格,如示例应用程序:
您可以使用此处提供的自定义 BrowseFragment 组件:https://github.com/dextorer/BuildingForAndroidTV
您将能够复制电视版 YouTube 应用提供的相同 UI 结构。
更新
我编写了一个简单的库,它扩展了 Leanback 并提供了更简化(和可靠)的定制。这是:
我所做的是扩展 ListRowPresenter class(例如: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 Class 上,当您创建适配器(HeadersAdapters 和 RowsAdapters)时,您必须使用扩展 class:
mHeadersAdapter = new ArrayObjectAdapter(new ListVideosRowPresenter());
为了避免显示 headers,(在 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);
}