Как улучшить производительность сетки данных при использовании itemrenderer без сетки данных? - PullRequest
0 голосов
/ 31 июля 2009

По причинам низкой производительности DataGrid будет кэшировать флажки и повторно использовать их для разных строк. Если у вас 50 строк, это не создаст 50 флажков. Он создаст столько флажков, которые видны, плюс еще несколько для заполнения, а затем повторно использует их при прокрутке. Вот почему вам нужно явно управлять своим состоянием. Как это можно улучшить? Как можно зафиксировать значение флажка? Я использовал флажок, как показано ниже, но флажок не запоминает значения

 <mx:DataGrid id="calamount"dataProvider="{xml_coupon.lastResult.Teamcoupon.match_details}" variableRowHeight="true">
<mx:columns>
    <mx:DataGridColumn headerText="1"  rendererIsEditor="true" editorDataField="selected">
    <mx:itemRenderer>
    <mx:Component>
    <mx:HBox verticalAlign="middle" paddingLeft="2">
    <mx:CheckBox  id="checkbox1"  selected="{outerDocument.checkedAll}" click="{data.check1=checkbox1.selected;outerDocument.calcValues()}"/>
    </mx:HBox>
    </mx:Component>
    </mx:itemRenderer>
    </mx:DataGridColumn>
</mx:columns>

Ответы [ 3 ]

1 голос
/ 31 июля 2009

Я не уверен, что полностью понимаю ваш вопрос, но если вы ищете способы улучшить производительность ваших пользовательских средств визуализации элементов, я бы начал с отличного поста Алекса Харуи в его блоге. Конкретно раздел по производительности:

Производительность

При разработке пользовательских средств визуализации элементов следует учитывать производительность. Хотя просто и быстро взять Canvas, HBox или VBox и поместить туда несколько компонентов с рендером, имейте в виду, что контейнеры действительно большие и медленные, и если вы собираетесь иметь много их видимых в вашей DataGrid Вы можете столкнуться с проблемами производительности. Мы часто их не видим, потому что мы разрабатываем на очень быстрых машинах, но вы должны учитывать, какое оборудование будет у вашего конечного пользователя. Поэтому я бы не рекомендовал использовать любой контейнер из mx.containers в пользовательском средстве визуализации элементов, если на экране будет больше полдюжины. Если вы не размещаете более трех или четырех виджетов в вашем рендере, будет намного быстрее начать с UIComponent и просто написать некоторую логику, чтобы расположить компоненты в правильном положении. Контейнеры из mx.containers также учитывают логику отложенного создания, полосы прокрутки, отсечение и множество других вещей, которые вам, вероятно, не понадобятся в вашем рендерере.

Вот почему вы увидите, что во всех примерах вместо MXML используется ActionScript. Да, это означает, что вы не можете использовать FlexBuilder для кодирования рендерера, и да, некоторые из этих примеров могут быть выполнены в MXML, но в MXML легко создавать вещи, которые генерируют дополнительный код, который вам может не понадобиться. Вы заметите, что я не использую привязку данных в этих примерах по той же причине. На самом деле это немного расточительно (хотя и очень удобно) использовать привязку к чему-то, что не будет меняться или изменяться только один или два раза. Вместо этого я установил для поставщика данных событие инициализации (и сделал бы это для события результата, если бы использовал HTTPService). (1)

0 голосов
/ 04 августа 2009

Вы связываете флажок свойства selected с неправильной вещью. Он должен быть привязан к data.check1 (хорошее многозначительное имя), судя по коду в вашем обработчике событий щелчка. Который, кстати, должен был быть событием «изменения», потому что вы можете изменить значение флажка, когда нажимаете клавишу ВВОД или ПРОБЕЛ, и он имеет фокус, и вы не получите событие щелчка в этом случае. *

0 голосов
/ 31 июля 2009

Вы имеете в виду, что ваши флажки не запоминают значения? Вы должны удостовериться, что ваши данные визуализаторов данных управляются.

<mx:CheckBox selected="{data.someBooleanProperty}"/>

Таким образом, когда вы прокручиваете, он будет проверять, правильно ли они отмечены / сняты.

...