Android Leanback库HorizontalGridView scrollToPosition不起作用

我'm implementing an Android TV app and I'使用 Leanback library 中的 HorizontalGridView . 我有自定义布局 .

在创建活动之后,我必须将 HorizontalGridView 滚动到特定位置,但不幸的是 scrollToPositio(position) 方法根本无法处理此布局 . 它什么都不做 . 我发现,当我特意将 layout manager 设置为 LinearLayoutManager 时,它可以工作 . 但问题是,当我不使用 leanback 默认 HorizontalGridView LayoutManager 时,使用D-pad聚焦下一个项目时会出现问题 .

基本上如果我使用普通 RecyclerView ,带有D-pad的控件没有按预期工作,所以我决定使用 leanback 实现,这个问题解决了,但到目前为止我无法使用 scrollToPosition 方法 .

有任何想法吗?

我的代码片段:

布局:

<android.support.v17.leanback.widget.HorizontalGridView
        android:id="@+id/photo_gallery_recycler"
        android:layout_width="match_parent"
        android:layout_height="@dimen/gallery_image_size"
        android:clipChildren="false"
        app:itemView="@{viewModel.photoItemView}"
        app:items="@{viewModel.photosUrl}"/>

代码[Kotlin]:

binding.photoGalleryRecycler.scrollToPosition(position)
binding.photoGalleryRecycler.getChildAt(position)?.requestFocus()

我也试过这样的一些黑客:

// save default leanback layout manager    
var defaultLayoutManager = binding.photoGalleryRecycler.layoutManager
// set LinearLayoutManager
binding.photoGalleryRecycler.layoutManager = LinearLayoutManager(activity, LinearLayoutManager.HORIZONTAL, false)
// scroll to position and request focus
binding.photoGalleryRecycler.scrollToPosition(position)
binding.photoGalleryRecycler.getChildAt(position)?.requestFocus()
// set default layout manager back to the view
binding.photoGalleryRecycler.layoutManager = defaultLayoutManager

回答(1)

2 years ago

你需要使用 setSelectedPosition(position)

如果需要动画,你可以尝试 setSelectedPositionSmooth(position)

setSelectedPosition Developer docs.