Высота ItemRenderer (и изменения высоты) не отражена в строке AdvancedDataGrid - PullRequest
1 голос
/ 14 сентября 2011

У меня AdvancedDataGrid с переменной высотой строки, установленной в true.Я написал средство визуализации элемента cutsom, основанное на искровом компоненте DataGroup.У каждой строки в сетке есть несколько объектов для отображения, положение и ширина x объектов основаны на данных самого объекта.

У меня есть собственный макет, написанный для DataGroup, который измеряет и позиционирует каждый объектна основании своих данных.Каждый объект в каждой строке может усекать или не усекать свою метку.Когда метки не усекаются, я вычисляю фактическую ширину объекта и проверяю его размер вручную (чтобы заставить метку иметь правильную ширину и разметку всех ее текстовых строк и переизмеряю себя) в методе измерения Layout группы DataGroup для точного измеренияСама группа данных.

Все макеты, размеры, размеры, отображение и т. д. работают правильно.Объекты сообщают правильную высоту, в которой они нуждаются, когда не обрезают метки, группа данных сообщает правильный размер, необходимый для рисования всей сущности своей строки (все из методов измерения, которые им необходимы в жизненном цикле UIComponent).

Когда внутри самой AdvancedDataGrid, строки имеют неправильный размер.Большинство строк не требуют нескольких строк и отображаются просто отлично.Те, которые требуют нескольких строк, имеют большую высоту строки, но недостаточно большие, чтобы вместить весь текст в большинстве случаев.Группа данных для этой строки (и ее itemRenderers) обрезаются.Кроме того, при прокрутке сетки каждая прокручиваемая строка на экране имеет высоту текстовой строки в 1 по умолчанию, независимо от данных.В любом случае изменение размера AdvancedDataGrid (не изменение размеров его столбцов, но самой сетки) заставляет все строки привязываться к правильной требуемой высоте.Повторная прокрутка приводит к появлению строк неправильного размера.

Кроме того, расположение каждого объекта в строке определяется несколькими внешними факторами - чаще всего это видимый диапазон (по горизонтали).Изменение этого видимого диапазона приведет к тому, что все средства визуализации элементов изменят свой размер (через пользовательский класс макета) до новых размеров и переизмерит новый макет DataGroup.Это фактически запускает пользовательский анализатор иерархии, который перестраивает все ArrayCollections, используемые в поставщике данных AdvandedDataGrid, поэтому ArrayCollections отправляет события изменения, на которые реагирует каждая группа данных DataGroup, поэтому сама группа DataGroup аннулирует свой размер и макет.

Этиизменение размеров не приводит к тому, что AdvancedDataGrid переоценивает высоту строк, и я должен снова изменить размер самого ADG, чтобы привязать строки к правильной высоте.

Любой имеет опыт работы со строками динамического размера в AdvancedDataGrid или ItemRenderers, которые должныпринудительно заставить AdvandedDataGrid перекомпоновывать свои строки?

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

Я столкнулся с аналогичной проблемой, связанной с гораздо более простым средством визуализации элементов, в основном с меткой, котораяВы будете учитывать максимальную высоту, изменяете размеры до той высоты, которая потребуется для данных переноса слов, а затем создаете полосы прокрутки для себя.Опять же, размеры данных почти совпадают при создании сетки, тогда изменение ширины столбца в сетке не изменяет размер строки, так как средство визуализации элементов подстраивается под новую ширину.Только при изменении размера самой сетки средства визуализации элементов изменяют размер правильно, создают полосы прокрутки, и высоты строк сетки являются правильными.Источник для этого средства визуализации элементов:

<s:Scroller xmlns:fx="http://ns.adobe.com/mxml/2009" 
            xmlns:s="library://ns.adobe.com/flex/spark" 
            xmlns:mx="library://ns.adobe.com/flex/mx"
            implements="mx.controls.listClasses.IDropInListItemRenderer,mx.controls.listClasses.IListItemRenderer"
            horizontalScrollPolicy="off" width="100%">
    <fx:Script>
        <![CDATA[

            import mx.controls.listClasses.BaseListData;
            import mx.controls.listClasses.IDropInListItemRenderer;
            import mx.controls.listClasses.IListItemRenderer;
            import mx.events.ResizeEvent;


            private var _listData:BaseListData;
            private var _data:Object;

            private var _listOrData_c:Boolean = false;

            public function get listData():BaseListData
            {
                return _listData;
            }
            public function set listData(value:BaseListData):void
            {
                _listData = value;
                _listOrData_c = true;
                invalidateProperties();
            }

            public function get data():Object
            {
                return _data
            }
            public function set data(value:Object):void
            {
                _data = value;
                _listOrData_c = true;
                invalidateProperties();
            }

            override protected function commitProperties():void
            {
                if(_listOrData_c)
                {
                    _listOrData_c = false;
                    label.text = _listData.label;
                }

                super.commitProperties();
            }

        ]]>
    </fx:Script>
    <fx:Declarations>
        <!-- Place non-visual elements (e.g., services, value objects) here -->
    </fx:Declarations>
    <s:Group width="100%">
        <s:layout>
            <s:BasicLayout clipAndEnableScrolling="true" />
        </s:layout>
        <s:Label id="label" width="100%"/>
    </s:Group>
</s:Scroller>

Бросьте его в AdvancedDataGrid и установите некоторые данные с очень большими текстовыми блоками.Измените размеры столбцов, затем измените размер самой сетки, надеюсь, вы сможете воспроизвести те же результаты.Убедитесь, что вы установили максимальную высоту для средств визуализации элементов, например:

            <mx:AdvancedDataGridColumn id="adgc1" headerText="Name" dataField="label">
                <mx:itemRenderer>
                    <fx:Component>
                        <newLayouts:ScrollingTextItemRenderer maxHeight="60" />
                    </fx:Component>
                </mx:itemRenderer>
            </mx:AdvancedDataGridColumn>

Использование Flex 4.1.

Спасибо за помощь.

Вот скриншоты, детализирующие средство визуализации элемента, как оно должно функционировать (поскольку я установил измерение, чтобы принудительно проверять метку при явной ширине тока перед измерением):

Очень широкий столбец, без полос прокруткиИзмеренная высота меток отображается в высоте строки enter image description here

Столбец с меньшей шириной, некоторые средства визуализации достигли максимальной высоты и создают полосы прокрутки, последний модуль визуализации все еще использует измеренную высоту метки enter image description here

Меньший по-прежнему столбец, все максимальные высоты достигнуты и скроллеры присутствуют для всех меток, скроллеры будут выбирать строку при использовании, но разрешать прокрутку, чтобы весь текст можно было просмотреть.enter image description here

Ответы [ 2 ]

2 голосов
/ 15 сентября 2011

После гораздо более тщательного осмотра этим утром метод meausre для самих средств визуализации DataGroup не позволил правильно проверить размер дочерних элементов при первом прохождении измерения.

Мне нужно, чтобы надписи в этих элементах имели ограниченную ширину, чтобы они соответствующим образом переносились по словам, поэтому, когда я измеряю строку DataGroup, мне нужно установить ширину каждого из ее дочерних элементов, а затем измерить дочерний элемент.Проблема заключалась в том, что validateSize () не правильно проверял размер элементов (метка не обновлялась и генерировала новые текстовые строки на этом этапе).Все последующие проходы измерений уже имели ширину, подтвержденную для каждого потомка, поэтому их повторное измерение было правильным.Поэтому при изменении размера сетки сработали последующие вызовы мер.

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

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

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

У меня ScrollingLabelItemRenderer теперь снова работает правильно, мне пришлось принудительно применитьширину до метки и проверьте ее при измерении средства визуализации, поскольку оно все еще использовало свою предыдущую ширину и текстовые строки при измерении перед применением новой ширины в последующем updateDisplayList ...

        override protected function measure():void
        {
            label.width = getExplicitOrMeasuredWidth() - verticalScrollBar.getExplicitOrMeasuredWidth();
            label.validateNow();
            super.measure();
        }
0 голосов
/ 15 сентября 2011

Я потратил несколько недель, пытаясь заставить MX AdvancedDataGrid правильно обрабатывать переменную высоту строки. Ошибка действительно не удалась. Всегда есть случаи, когда высоты неверны. Все это связано с изменением макета рендеринга сетки, что является очень длительной операцией, делающей проект чрезвычайно медленным.

Я предлагаю вам перейти на Spark AdvancedDataGrid, который основан на Spark DataGrid и работает намного быстрее для сложных средств визуализации .

...