在BrowseFragment中设置项目之间的边距。

13

我正在为Android TV开发一个应用程序,但在使用提供的Leanback支持库中的BrowseFragment时遇到了问题。 我们可以更改RowsFragment中项目之间的间距吗?


填充元素是一种解决方案吗? - Sebastiano
谢谢您的快速回复,我最终找到了解决方案。 - corochann
5个回答

13

在这里输入图片描述

我自己找到了答案。关键是HorizontalGridView,它会存储每一行的项目列表。我们可以通过R.id.row_content获取该HorizontalGridView的引用。最后,setItemMargin方法就是解决方案。 以下是示例代码,我能够得到顶部的图片。

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent) {
    HorizontalGridView horizontalGridView = (HorizontalGridView) parent.findViewById(R.id.row_content);
    horizontalGridView.setItemMargin(400); // You can set item margin here.

    ...

    };

如何为列表行设置垂直边距?能帮我解决一下吗? - Jay Rathod
1
尝试像这样使用 ((ViewGroup.MarginLayoutParams) horizontalGridView.getLayoutParams()).setMargins(0, 0, 0, 100);,你可以改变 horizontalGridView 自身的边距。 - corochann
好的,我会尝试。另外,您能告诉我如何在行中显示的卡片上设置白色边框吗? - Jay Rathod
1
如何仅为左侧的第一个项目设置边距? - NehaK
1
你不会将自己的答案标记为正确吗?这可能会帮助很多正在搜索的人。 - A_rmas

12

您可以覆盖一些样式来实现这个目标,例如:

<style name="AppTheme.Leanback" parent="Theme.Leanback">
  ..
  <item name="rowHorizontalGridStyle">@style/TvHorizontalGridView</item>
  ..
</style>

<style name="TvHorizontalGridView" parent="Widget.Leanback.Row.HorizontalGridView">
    <item name="horizontalMargin">@dimen/margin_medium</item>
    <item name="verticalMargin">@dimen/margin_medium</item>
</style>

其中 @dimen/margin_medium 是您希望的边距大小。


2

理想情况下,可以像@Billy所回答的那样覆盖样式细节。不幸的是,弄清楚每个细节可能需要一些时间。如果您要查找的内容无法进行样式设置,则可以覆盖内置的leanback资源(但不确定是否可靠/安全)。例如:

<dimen name="lb_browse_rows_margin_top">167dp</dimen>
<dimen name="lb_browse_item_vertical_spacing">8dp</dimen>
<dimen name="lb_browse_expanded_row_no_hovercard_bottom_padding">28dp</dimen>

我建议为它们创建不同的样式,而不是覆盖默认资源,因为它们被广泛重用。 - A_rmas

0
Presenter 类的 onCreateViewHolder 方法中,我们可以使用 setItemSpacingsetPadding 等方法来设置参数。
class TVPresenter() : Presenter() {

override fun onCreateViewHolder(parent: ViewGroup): ViewHolder {
     parent.findViewById<HorizontalGridView>(R.id.row_content).run {
                setItemSpacing(10)
                setPadding(40,10,40,10)
            }
     val cardViewLayout = LayoutInflater.from(parent.context)
            .inflate(R.layout.item_layout, parent, false)
     return ViewHolder(cardViewLayout)
}

0
我曾经遇到这样一个情况,需要在ListRow中实现无限滚动,并且需要在每个最后一项后添加额外的空间。因此,我通过向适配器的presenterSelector添加自定义presenter来解决了这个问题:
class EmptySpacePresenter : Presenter() {

override fun onCreateViewHolder(parent: ViewGroup): ViewHolder {
    val emptySpaceView = FrameLayout(parent.context).apply {
        val width = context.resources.getDimension(R.dimen.gallery_carousel_horizontal_gap).toInt()
        layoutParams = FrameLayout.LayoutParams(width, FrameLayout.LayoutParams.MATCH_PARENT)
        isClickable = false
        isFocusable = false
        isFocusableInTouchMode = false
    }

    return ViewHolder(emptySpaceView)
}

override fun onBindViewHolder(viewHolder: ViewHolder?, item: Any?) = Unit

override fun onUnbindViewHolder(viewHolder: ViewHolder?) = Unit

}

class MyObjectAdapter() : ArrayObjectAdapter() {

    init {
        presenterSelector = ClassPresenterSelector()
            .addClassPresenter(ListItem::class.java, ListItemPresenter())
            .addClassPresenter(EmptySpace::class.java, EmptySpacePresenter())
    }
}

EmptySpace.class 包含什么内容?我在 leanback 库中没有找到任何东西。 - kalpana c

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