首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >电视RecylerView中的环路聚焦

电视RecylerView中的环路聚焦
EN

Stack Overflow用户
提问于 2019-11-07 13:09:43
回答 1查看 612关注 0票数 1

根据https://developer.android.com/training/tv/start/navigation

您应该将导航顺序设置为一个循环,以便最后一个控件将焦点指向第一个控件。

我尝试为RecyclerView项实现这样的行为:

代码语言:javascript
运行
复制
fun RecyclerView.loopFocusVertically() {
    viewTreeObserver.addOnGlobalLayoutListener {
        val children = getAllChildren()
        val firstFocusableItem = children.firstOrNull { it.isFocusable }
        val lastFocusableItem = children.lastOrNull { it.isFocusable }
        firstFocusableItem?.let { it.nextFocusUpId = lastFocusableItem?.id ?: it.id }
        lastFocusableItem?.let { it.nextFocusDownId = firstFocusableItem?.id ?: it.id }
    }
}

因此,在布局更改时,我做了第一个视图有nextFocusUpId引用到了最后一个视图,最后一个视图nextFocusDownId引用了第一个视图。但是它只在所有视图实际上都被放置在屏幕上的情况下才能工作,这在一般情况下显然是不正确的。RecyclerView实际上回收视图,因此屏幕上不可能同时存在最后视图和第一个视图。

如何在精简模式下实现rv对焦环?我尝试过从精简库中使用androidx.leanback.widget.VerticalGridView,但它也没有所需的行为。

默认情况下,从rv焦点的第一个可聚焦项按压到rv之外的其他可聚焦视图,这是不太合适的。

EN

回答 1

Stack Overflow用户

发布于 2019-11-23 09:02:41

默认情况下,从rv焦点的第一个可聚焦项按下

跳转到rv之外的其他可聚焦视图,这并不合适。

首先,对于UX来说,如果您的列表上有视图,那么如果您想滚动到最后一项,或者转到上面的视图,那么按下将是一个问题。

说到这里,我建议您只从底部给出循环选项,如果您在列表上面有一个视图,也可以获得焦点。

一般情况下,我建议您检查VerticalGridView/HorizontalGridView,以便在向后倾斜的应用程序中添加行和列表。

在这个示例中,我调整了它以使用RecyclerView来回答您的问题。

为此,您必须捕获按钮事件,检查它是否是最后一项,如果是,请将焦点请求到第一项。

代码语言:javascript
运行
复制
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
    if (event.getAction() == KeyEvent.ACTION_UP) {
        if (event.getKeyCode() == KeyEvent.KEYCODE_DPAD_DOWN) {
            if (onDownClick(event)) {
                return true;
            }
        }
    }
    return super.dispatchKeyEvent(ev);
}

public boolean onDownClick(KeyEvent event) {

    int currentIndex = 0;

    if (mAdapter != null) {
        currentIndex = mAdapter.indexOf(mCurrentItem);
    }

    if (currentIndex == mAdapter.size() - 1) {
        mListRecycler.scrollToPosition(0);
        if (mListRecycler.findViewHolderForAdapterPosition(0) != null) {
            mListRecycler.findViewHolderForAdapterPosition(0).itemView.requestFocus();
        }
        return true;
    }

    return false;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58749479

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档