如何自定义 Leanback 的 ListRows?

Posted

技术标签:

【中文标题】如何自定义 Leanback 的 ListRows?【英文标题】:How to customize Leanback's ListRows? 【发布时间】:2017-07-06 02:33:06 【问题描述】:

android 的leaback 库提供了一些自定义 RowFragment 的标准方法,包括 Rows 和 Cards 本身,但我不确定如何在框架提供的之外添加自定义元素。

我特别想要实现的是在一行中添加一个 FooterItem,类似于每行都有一个 HeaderItem。

我想获得 ListRowView / ListRowPresenter 中的现有功能,但我不确定如何“正确”地做到这一点。

【问题讨论】:

【参考方案1】:

Leanback 的几乎所有事情一样,给猫剥皮的方法不止一种。

我们需要自定义 ListRow 以向标题添加更多填充。我们通过覆盖ListRowPresenter 中的onBindRowViewHolder,获取标题的View(通过View header = holder.getHeaderViewHolder().view;)实现了这种级别的自定义。然后我们用header.getLayoutParams().height = rowItem.getRowHeaderHeight();改变了它的高度。

使用同样的技术,您可以将页脚视图动态添加到holder.view(使用addView)。

另一种方法是遵循RowPresenter 的文档建议。相关引用是:

当 RowPresenter 的子类添加 UI 小部件时,它应该继承 RowPresenter.ViewHolder 并覆盖 createRowViewHolder(ViewGroup) 和 initializeRowViewHolder(ViewHolder)。子类必须为小部件使用布局 ID“row_content”,该小部件将与父片段中可能存在的任何 HeadersFragment 的标题对齐。

因此,使用这种新的推荐方法,您基本上可以提供自己的 xml。我相信你甚至可以继承ListRowPresenter。要查看代码是如何工作的,请查看 ListRowView 以查看它为 R.layout.lb_list_row 扩展了 xml。然后它只使用R.id.row_content 的视图。

那将是holder.view 提供的实际视图,然后您可以在其上设置文本并做任何您想做的事情。

如果您需要任何进一步的说明,请告诉我。

【讨论】:

我最终扩展了 ListRowPresenter,并覆盖了 onBindViewHolder,尽管我必须添加一个检查以查看我的额外视图是否已添加(因为出于某种原因 onCreateView 被标记为最终视图)。我真的希望我能在 onCreate 上做,所以它肯定只做一次,而不是每次都检查,但我想这很好。至于自定义 Header,您知道是否有办法通过扩展leaback 主题、覆盖一些值并将该主题设置为您的活动来做到这一点? 这确实有效,我完全按照你们俩的建议做了。 你能告诉我一些你在 createRowViewHolder(ViewGroup) 中所做的代码

以上是关于如何自定义 Leanback 的 ListRows?的主要内容,如果未能解决你的问题,请参考以下文章

在 Leanback 应用程序中自定义播放控件

Leanback DetailFragment FullWidthDetailsOverviewRowPresenter 自定义

Leanback - 如何创建马赛克视图?

如何在leanback BrowseFragment中实现两个PageRow之间的转换?

在 Leanback 中使用支持库中的字体

Android Leanback 库 Horizo​​ntalGridView scrollToPosition 不起作用