Android Tv RecyclerView 设置其项目的下一个焦点
Posted
技术标签:
【中文标题】Android Tv RecyclerView 设置其项目的下一个焦点【英文标题】:Android Tv RecyclerView set next focus of its item 【发布时间】:2018-08-27 22:34:27 【问题描述】:我正在开发 android 电视,在我们的 Fragment 中有两个 Horizontal Recyclerview,当我使用 D-pad 朝右方向滚动 First Recyclerview 时,它滚动良好,当我到达其 Recycler 视图的最后一个焦点项目时,会自动聚焦转到第二个 Recycler 视图项。
如何预防?
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_
android:layout_
android:focusable="false"
android:orientation="vertical">
<RelativeLayout
android:id="@+id/firstRelativeGrid"
android:layout_
android:layout_
android:focusable="false"
android:orientation="vertical">
<android.support.v7.widget.RecyclerView
android:id="@+id/gridView1"
android:layout_
android:layout_
android:layout_alignParentEnd="true"
android:layout_alignParentStart="true"
android:clipToPadding="false"
android:focusable="false"
android:paddingLeft="0dp"
android:paddingRight="755dp" />
<android.support.v7.widget.RecyclerView
android:id="@+id/gridView2"
android:layout_
android:layout_
android:layout_alignBaseline="@+id/gridView1"
android:layout_marginLeft="0dp"
android:focusable="false"
android:nextFocusRight="@null"
android:nextFocusUp="@+id/home_textview" />
</RelativeLayout>
<RelativeLayout
android:id="@+id/secondRelativeGrid"
android:layout_
android:layout_
android:focusable="false"
android:focusableInTouchMode="false"
android:orientation="vertical">
<android.support.v17.leanback.widget.MyHorizontalGridView
android:id="@+id/gridView3"
android:layout_
android:layout_
android:layout_alignParentEnd="true"
android:layout_alignParentStart="true"
android:clipToPadding="false"
android:focusable="false"
android:paddingLeft="0dp"
android:paddingRight="754dp" />
<android.support.v17.leanback.widget.MyHorizontalGridView
android:id="@+id/gridView4"
android:layout_
android:layout_
android:layout_alignBaseline="@+id/gridView3"
android:layout_marginLeft="0dp"
android:clipToPadding="false"
android:descendantFocusability="blocksDescendants"
android:focusable="false"
android:paddingLeft="0dp"
android:paddingRight="-2dp"
/>
</RelativeLayout>
【问题讨论】:
【参考方案1】:可能为时已晚,但对于仍在寻找解决方案的任何人:
您应该在搜索下一个焦点发生时编写自己的逻辑,并在列表末尾提供最后一个视图作为下一个焦点项目,或者您可以根据需要修改逻辑。例如:
override fun onInterceptFocusSearch(focused: View?, direction: Int): View?
val position = getPosition(focused)
val count = itemCount
lastKnownPosition = position
return if (position == count - 1 && direction == View.FOCUS_RIGHT)
focused
else
super.onInterceptFocusSearch(focused, direction)
并且此方法将成为您的布局管理器的一部分。
【讨论】:
【参考方案2】:尝试将recyclerview
的focusable
属性设置为false
recyclerview.setFocusable(false);
【讨论】:
【参考方案3】:我很晚才发布这个答案,但有一种方法可以做到,在 Adapter 类中检查项目是否是第一个,并将 nextFocusLeftId 设置为自身。 例如。 itemview.setnextFocusLeftId(itemview.gedId) 对回收站视图的最后一个元素执行相同的操作。
【讨论】:
以上是关于Android Tv RecyclerView 设置其项目的下一个焦点的主要内容,如果未能解决你的问题,请参考以下文章
焦点更改时强制 RecyclerView 滚动(Android TV)
Android为TV端助力 listview与recyclerview上下联动
Android TV端的(RecyclerView)水平滚动焦点错乱问题
android tv常见问题(四)焦点变化时,Recyclerview是如何进行滚动的
Android Tv RecyclerView 设置其项目的下一个焦点
潜在的 Glide 错误 - 在 Android TV 上使用 Dpad 快速滚动时,RecyclerView 项目失去焦点