Flex AdvancedDataGrid деактивирует отложенный рендеринг

У меня есть компонент AdvancedDataGrid с некоторыми настраиваемыми строками. У меня ограниченное количество видимых строк внутри компонента. Доступ к другим строкам можно получить с помощью полосы прокрутки. В моем приложении у меня есть кнопка Save & Next, которая сохраняет фактическую выбранную запись и повторяет выбранный элемент сетки на 1 до конца. К сожалению, эта процедура работает только до тех пор, пока я не дойду до конца видимых строк. После этого Grid вылетает, когда я выбираю невидимую строку и пытаюсь прокрутить ее программно:

//Bad Crash
this.documentBrowser.dg.selectedIndex = index + 1;
this.documentBrowser.dg.validateNow();
this.documentBrowser.dg.scrollToIndex(this.dg.selectedIndex);

Я обнаружил, что в этот момент не создается следующий элемент. Есть ли возможность отобразить все элементы в сетке после загрузки или отключить ленивую визуализацию?

Трассировка стека:

TypeError: Ошибка № 1010: термин не определен и не имеет свойств. в mx.controls.listClasses :: AdvancedListBase / makeRowsAndColumnsWithExtraRows () [/ Users / justinmclean / Documents / ApacheFlexSDK / frameworks / projects / advancedgrids / src / mx / controls / listClasses / AdvancedListBase.as: 4008 ]s.listClasses: : AdvancedListBase / updateDisplayList () [/ Users / justinmclean / Documents / ApacheFlexSDK / frameworks / projects / advancedgrids / src / mx / controls / listClasses / AdvancedListBase.as: 3582] в mx.controls :: AdvancedDataGridBaseEx / updateDisplayList () [/ updateDisplayList () [/ updateDisplayList () /justinmclean/Documents/ApacheFlexSDK/frameworks/projects/advancedgrids/src/mx/controls/AdvancedDataGridBaseEx.as:2033] в mx.controls :: AdvancedDataGrid / updateDisplayList () [/ Users / justinmclean / Documents / Documents / advancedgrids / src / mx / controls / AdvancedDataGrid.as: 2907] в mx.controls.listClasses :: AdvancedListBase / validateDisplayList () [/ Users / justinmclean / Documents / ApacheFlexSDK / frameworks / projects / advancedgrids / src / mx / controls / listClasses /AdvancedListBase.as:3480] в mx.managers: : LayoutManager / validateDisplayList () [/ Users / justinmclean / Documents / ApacheFlexSDK / frameworks / projects / framework / src / mx / manager / LayoutManager.as: 744] в mx.managers :: LayoutManager / doPhasedInstantiation () [/ Users / justinmclean /Documents/ApacheFlexSDK/frameworks/projects/framework/src/mx/managers/LayoutManager.as:827] в mx.managers :: LayoutManager / doPhasedInstantiationCallback () [/ Users / justinmclean / Documents / ApacheFlexSDK / frameworks src / mx / manager / LayoutManager.as: 1195]


person Andreas    schedule 27.05.2013    source источник
comment
Если вы запустите отладочный проигрыватель, он должен дать вам трассировку стека. Отправка трассировки стека поможет вам приблизиться к источнику проблемы.   -  person flexicious.com    schedule 29.05.2013
comment
Здравствуйте, я сделал это, и это показывает только то, что scrollToIndexFunction длится более 15 секунд. С этой информацией я отладил ADG и обнаружил, что не все элементы находятся в списке поддержки визуализированного ADG. Когда я прокручиваю ADG до необработанного элемента, возникает ошибка. Вот почему я спросил о функции ленивого рендеринга ADG.   -  person Andreas    schedule 29.05.2013


Ответы (1)


Я почти уверен, что функция ленивого рендеринга повторно использует ваши рендереры элементов, как только экран скатывается (для оптимизации производительности). Так что, может быть, вам нужно делать то, что вы делаете, только с видимыми, и это останется «готовым» для всех экземпляров рендерера?

Вы уверены, что вам нужен доступ к самим ФАКТИЧЕСКИМ видимым строкам, а не к элементам в вашем dataProvider, которые их поддерживают? Если доступ к вашим резервным данным в порядке, возможно, вам следует вместо этого выполнить итерацию через свой dataProvider.

Я сделал это маленькое приложение, которое прокручивает и выделяет строку с помощью функции gotoGridItem(index). Я прокручиваю до элемента, прежде чем пытаться установить selectedIndex - может быть, это было причиной сбоя?

Вот мой код:

<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
               xmlns:s="library://ns.adobe.com/flex/spark" 
               xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600">

    <mx:AdvancedDataGrid id="theGrid" dataProvider="{rowDataItems}" x="50" y="50"/>
    <s:NumericStepper id="rowIndSpr" minimum="0" maximum="{theGrid.dataProvider.length-1}" value="{8}"/>
    <s:Button click="gotoGridItem(int(rowIndSpr.value))" label="Go" y="20" />

    <fx:Script>
        <![CDATA[
            import mx.collections.ArrayCollection;
            [bindable] public var rowDataItems:ArrayCollection = new ArrayCollection([

                //...lots of data items for rows ...

            ]);

            public function gotoGridItem(index:uint):void{


                theGrid.scrollToIndex(index);
                theGrid.selectedIndex = index;
                theGrid.validateNow();
            }
        ]]>

    </fx:Script>
</s:Application>
person pseudopeach    schedule 29.05.2013
comment
Здравствуйте, хорошее замечание. Но поскольку я хочу использовать функцию scrollToIndex, мне нужно установить selectedIndex. - person Andreas; 30.05.2013
comment
Да, этот код действительно помогает. ТАК ВАЖНОЕ ПРИМЕЧАНИЕ ЗДЕСЬ. 1. scrollToIndex 2. установить selectedIndex только в том случае, если элемент виден после прокрутки. Спасибо за разъяснения - person Andreas; 31.05.2013
comment
Да, возможно, он завершит создание экземпляров рендереров после того, как прокрутится до них. - person pseudopeach; 01.06.2013