【发布时间】:2016-05-14 05:32:16
【问题描述】:
左右两个列表都是带有垂直 LinearLayoutManagers 的 RecyclerViews,Header 视图是静态的。使用 D-PAD 导航可以在一个列表中正常工作,但是从一个列表切换到另一个列表时会出现问题。焦点从列表 1 的第 5 项移动到列表 2 的第 5 项。当列表 2 少于 5 项时,它就会失去焦点。
我希望保存最后一个焦点项目索引,当用户导航 list1-list2-list1 时,具有该索引的项目再次获得焦点,并防止视图失去焦点。有什么好的解决办法吗?
要求的行为: 用户导航到列表顶部并按“UP” - 焦点停留在原处,没有任何反应。 用户导航到列表底部并按下“DOWN” - 焦点停留在原处,没有任何反应。 用户从 list1 导航到 list2 - 以前在 list2 中具有焦点的项目获得焦点,如果之前没有焦点,则 item0 获得焦点。
主要布局:
<?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>
【问题讨论】:
-
你能发布你的xml文件吗?
-
所以你想在你的回收站视图之间移动焦点,你能解释一下吗?
-
正确。我想记住 recyclerviews 中的最后一个焦点位置。当用户从 list1 导航到 list2 并返回到 list1 时,我想恢复 list1 以前关注的项目。 list2 也是如此。我也希望当用户在 list1 中的 item1 聚焦时按下 d-pad 上的“向上”时焦点不会移动,依此类推
-
您是否尝试过任何代码来获取最后位置的焦点,如果没有,请查看此链接stackoverflow.com/questions/26682277/…
-
jaydroider,选择和关注是不同的东西。我可以得到最后一个焦点位置,但看不到恢复它的方法。
标签: focus android-recyclerview android-tv d-pad