You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Roku技术问题:更新RowList内容时保留当前焦点项

如何在Roku RowList异步更新内容时保留当前焦点

这个问题在Roku开发里真的很头疼——我之前做流媒体应用的时候也遇到过类似的情况,每次异步加载新行就把用户的焦点打回第一行,体验特别差。咱们一步步来解决它:

核心问题分析

你现在的做法是把新行push到masterList后,直接把整个数组重新赋值给RowList的gridContent属性。哪怕是追加,这种“全量替换”的操作会让RowList重新初始化整个列表的状态,自然就把焦点重置回默认位置了。

最优解决方案:增量更新内容(推荐)

RowList本身提供了增量更新的API,不用替换整个content数组,直接追加新行就行,这样完全不会影响当前焦点:

function onMixedListResponse()
    ' 遍历新行,用appendRow逐个添加到RowList中
    for each newRow in newRowItems
        m.top.gridContent.appendRow(newRow)
    end for
    
    ' 如果需要维护你的masterList数据源,同步更新即可,不用再赋值给gridContent
    masterList.push(newRowItems)
end function

如果你的行内还需要异步追加项,同样可以用行对象的appendItem()方法,而不是替换整个行的内容:

' 假设要给第2行追加新项(Roku索引从0开始)
targetRow = m.top.gridContent.getRow(1)
targetRow.appendItem(newRowItem)

备选方案:手动保存并恢复焦点

如果因为业务限制必须全量替换gridContent,那就在更新前先把当前焦点位置存下来,更新后再手动恢复:

function onMixedListResponse()
    ' 1. 更新前保存当前焦点的行索引和行内项索引
    currentRowIdx = m.top.gridContent.getFocusedRowIndex()
    currentItemIdx = m.top.gridContent.getFocusedItemIndexInRow()
    
    ' 2. 执行你的内容更新逻辑
    masterList.push(newRowItems)
    m.top.gridContent = masterList
    
    ' 3. 恢复焦点,注意要做有效性检查,避免索引越界
    if currentRowIdx < m.top.gridContent.getNumRows() then
        m.top.gridContent.setFocusedRowIndex(currentRowIdx)
        
        ' 再检查行内项索引是否有效
        targetRow = m.top.gridContent.getRow(currentRowIdx)
        if currentItemIdx < targetRow.getNumItems() then
            m.top.gridContent.setFocusedItemIndexInRow(currentItemIdx)
        end if
    end if
end function

注意事项

  • 保存焦点的时机必须在开始更新内容之前,不能等到异步回调完成后再存——不然用户可能已经导航到其他行,保存的就不是原来的焦点了。
  • 一定要做索引有效性检查,比如用户原来聚焦的行可能已经被删除(如果有删除逻辑的话),或者新行的项数比保存的索引少,避免运行时报错。

内容的提问来源于stack exchange,提问作者Fabii

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:23:02