Я создаю приложение для Android TV со следующим макетом:
Оба списка слева и справа представляют собой RecyclerViews с вертикальными LinearLayoutManagers, представление заголовка является статическим. Навигация с D-PAD работает нормально в пределах одного списка, но при переключении с одного списка на другой возникают проблемы. Фокус перемещается, скажем, с элемента 5 списка 1 на элемент 5 списка 2. Когда список 2 короткий и содержит менее 5 элементов, он просто теряет фокус.
Я хочу, чтобы последний сфокусированный индекс элемента был сохранен, и когда пользователь перемещается по list1-list2-list1, элемент с этим индексом снова получает фокус, а также предотвращает потерю фокуса представлениями. Есть ли хорошее решение для этого?
Требуемое поведение: пользователь переходит к началу списка и нажимает «ВВЕРХ» — фокус остается там, где был, ничего не происходит. пользователь переходит в конец списка и нажимает «ВНИЗ» — фокус остается там, где он был, ничего не происходит. пользователь переходит от списка 1 к списку 2 — элемент, который ранее имел фокус в списке 2, получает фокус или элемент 0 получает фокус, если ранее ни один из них не был сфокусирован.
основной макет:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<ImageView
android:id="@+id/iv_background"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:focusable="false"
/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginBottom="27dp"
android:layout_marginLeft="48dp"
android:layout_marginRight="48dp"
android:layout_marginTop="27dp"
android:orientation="horizontal"
>
<LinearLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="2"
android:orientation="vertical"
>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:focusable="false"
android:orientation="horizontal"
>
<ImageView
android:id="@+id/iv_poster"
android:layout_width="@dimen/episodes_list_item_height"
android:layout_height="@dimen/episodes_list_image_width"
/>
<LinearLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:orientation="vertical"
>
<TextView
android:id="@+id/tv_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
>
<TextView
android:id="@+id/tv_release_date"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="left"
/>
<TextView
android:id="@+id/tv_rating"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="right"
android:drawableLeft="@drawable/ic_star_white_24dp"
android:drawablePadding="@dimen/view_padding_small"
/>
</FrameLayout>
<TextView
android:id="@+id/tv_description"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
/>
</LinearLayout>
</LinearLayout>
<android.support.v7.widget.RecyclerView
android:id="@+id/rv_seasons_list"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:focusable="false"
/>
</LinearLayout>
<android.support.v7.widget.RecyclerView
android:id="@+id/rv_episodes_list"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="3"
android:focusable="false"
/>
</LinearLayout>
</FrameLayout>
макет элемента, используемый для обоих списков:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="@dimen/seasons_list_item_height"
android:orientation="horizontal"
android:focusable="true"
>
<TextView
android:id="@+id/tv_title"
android:layout_width="0dp"
android:layout_height="match_parent"
android:gravity="center_vertical"
android:layout_weight="1"
/>
<TextView
android:id="@+id/tv_episodes_count"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:gravity="center_vertical"
android:ems="10"
/>
</LinearLayout>