Android TV Leanback RowsFragment 在开头保持焦点项目

Android TV Leanback RowsFragment keep focused item at the start

我正在开发 Leanback 应用程序,我已经通过 RowsFragment 实现了行和所有内容,并且一切正常。

至于现在,当我在行中的项目中左右移动时,获得焦点的项目会移动到屏幕中间并获得焦点。

例子-

我希望焦点项目位于行的开头而不是中间。

例子-

在网上找不到任何关于此的内容。 非常感谢有关此的任何信息。

您可能想试试这个方法:

void setSelectedPositionSmooth (int position)

Reference

遇到同样的问题并使用自定义 ListRowPresenter 解决了它:

override fun createRowViewHolder(parent: ViewGroup): RowPresenter.ViewHolder {
        val viewHolder = super.createRowViewHolder(parent)

        val itemWidth = parent.resources.getDimensionPixelSize(R.dimen.epg_program_width)

        with((viewHolder as ListRowPresenter.ViewHolder).gridView) {
            itemAlignmentOffset = parent.width / 2 - itemWidth / 2 - paddingLeft
        }

        return viewHolder
    }

如果您还希望行的最后一项出现在开头,请使用此 ListRowPresenter:

class FocusedItemAtStartListRowPresenter(focusZoomFactor: Int) : ListRowPresenter(focusZoomFactor) {
    override fun createRowViewHolder(parent: ViewGroup): RowPresenter.ViewHolder {
        val viewHolder = super.createRowViewHolder(parent)

        with((viewHolder.view as ListRowView).gridView) {
            windowAlignment = BaseGridView.WINDOW_ALIGN_LOW_EDGE
            windowAlignmentOffsetPercent = 0f
            windowAlignmentOffset = parent.resources.getDimensionPixelSize(R.dimen.lb_browse_padding_start)
            itemAlignmentOffsetPercent = 0f
        }

        return viewHolder
    }
}

这与 Leanback 启动器的功能类似。

要完成 tvlauncher,您还需要设置:

fadingLeftEdge = true // to fade previous item out

但更好的是使用他们的 FadingEdgeContainer,因为衰落边缘并不完全相同。

像这样:https://github.com/bosphere/Android-FadingEdgeLayout