Roku: обновление содержимого RowList без изменения текущего элемента фокуса - PullRequest
0 голосов
/ 30 мая 2018

Есть ли способ обновить или добавить элементы в содержимое RowList, сохраняя фокус на текущем выбранном / выделенном элементе строки?

Каждая строка в rowList представляет собой независимый список, который загружается асинхронно.RowList обновляется с помощью метода наблюдающего поля (рис. 1).Проблема заключается в том, что при добавлении нового содержимого в список строк фокус возвращается к первому элементу в первой строке.Я хочу сосредоточиться на любом элементе строки, к которому перешел пользователь, пока остальные строки загружаются асинхронно.

Я думаю, что проблема может заключаться в том, что я устанавливаю RowList.content в каждый новый обновленный masterList каждыйвремя (рис 2).

Я изменяю код для добавления нового элемента строки, это также приводит к сбросу фокуса на первую строку.

Fig 1.) m.ApiMixedListTask.observeField("responseObject", "onMixedListResponse")

Fig 2.)
function onMixedListResponse()
   masterList.push(newRowItems)

   m.top.gridContent = masterList
end function 

Рис. 3.) RowList: https://sdkdocs.roku.com/display/sdkdoc/RowList

  <RowList
                id="RowList"
                focusBitmapUri="pkg:/images/focus_grid.9.png"
                translation="[-60, 372]"
                itemSize="[1327, 218]"
                numRows="3"
                itemSpacing="[13, 0]"
                focusXOffset="[147]"
                rowFocusAnimationStyle="fixedFocusWrap"
                rowItemSize="[[262, 147]]"
                rowItemSpacing="[[16.5, 3]]"
                showRowLabel="true"
                showRowCounter="true"
                rowLabelOffset="[[147, 20]]"
                />

Несмотря на то, что это может привести к ухудшению работы пользователя, если удержание фокуса невозможно, возможно, мне просто придется заблокировать взаимодействие с пользователем во время загрузки контента.

Ответы [ 2 ]

0 голосов
/ 22 ноября 2018

Тебе нужно знать странное поведение Року.Если вы получаете новое содержимое строк из функции, некоторые ячейки будут недействительными, даже если вы создадите их так, как должно быть.

Например, этот код не будет работать должным образом:

function MapMatchList(data, countInARow = 4)
    rowListContent = createObject("RoSGNode","ContentNode")
    if data = invalid then return rowListContent
    list = data.List
    if list = invalid then return rowListContent

    row = createObject("RoSGNode","ContentNode")
    rowListContent.appendChild(row)
    counter = 1
    for i = 0 to list.count() - 1
        if counter > countInARow
            counter = 1
            row = createObject("RoSGNode","ContentNode")
            rowListContent.appendChild(row)
        end if
        match = MapMatch(list[i])
        if match <> invalid
            row.appendChild(match)
        end if
        counter = counter + 1
    end for
    return rowListContent
end Function

Когда вы вызываете функцию, некоторые ячейки становятся недействительными

rows = MapMatchList(m.top.MoreData)
for i = 0 to rows.getChildCount() - 1
    m.rowlist.content.appendChild(rows.getChild(i))
end for

Вам необходимо изменить код:

function MapMatchList(data, countInARow = 4, rowListContent = invalid)
    if rowListContent = invalid then rowListContent = createObject("RoSGNode","ContentNode")

Наконец, вы можете вызвать его:

MapMatchList(m.top.MoreData, 4, m.rowlist.content) 
0 голосов
/ 31 мая 2018

Вы правы!У вас есть проблемы, потому что вы каждый раз устанавливаете RowList.content в новый обновленный masterList.Я не уверен, сработает ли этот код, если вы просто скопируете / вставите его в свой проект, но он даст вам пример того, что вы могли бы сделать:

 for each item in m.ApiMixedListTask.newRowItems
    content = createObject("RoSGNode", "ContentNode")
    for each key in m.ApiMixedListTask.newRowItems[item]
         content[key] = m.ApiMixedListTask.newRowItems[item][key]       
    end for

    m.RowList.content.getChild(0).appendChild(content)
 end for
...