ItemRenderer高度(和高度更改)不反映在AdvancedDataGrid行中
我有一个AdvancedDataGrid可变行高设置为true。 我已经写了一个基于DataGroup spark组件的fragom项目渲染器。 网格中的每一行都有多个要显示的实体,实体的x位置和宽度基于实体本身的数据。
我为DataGroup编写了一个自定义布局,根据其数据测量和定位每个实体。 每行中的每个实体可以截断或不截断其标签。 当标签不会被截断,我计算物体的实际宽度和验证其大小manualy(以迫使标签具有正确的宽度和布局的所有文字行并重新测量本身)的DATAGROUP的布局的度量方法内精确地测量数据组本身。
布局,测量,大小,显示等都可以正常工作。 该实体报告时未截断的标签,他们需要正确的高度,DATAGROUP报告它需要借鉴其所有行的价值实体的(全部来自度量方法,如他们需要的UIComponent生命周期下)正确的尺寸。
在AdvancedDataGrid本身内部时,行的大小不正确。 大多数行不需要多行并显示得很好。 那些需要多行的行具有较大的行高,但在大多数情况下不足以容纳整个文本。 该行的DataGroup(及其itemRenderer)被剪切。 此外,滚动网格时,屏幕上滚动的每一行都是默认的文本行高度,无论数据如何。 在任何情况下,调整AdvancedDataGrid的大小(不调整其列的大小,但网格本身)会强制所有行捕捉到正确的所需高度。 再次滚动会产生不合适大小的行。
此外,行中每个实体的布局由几个外部因素决定 - 最常见的是可见范围(沿水平方向)。 更改此可见范围将触发所有项呈示器将其自身(通过自定义布局类)调整为新的大小并重新测量新的DataGroup布局。 这实际上触发了自定义的层次结构解析器重建AdvandedDataGrid数据提供内部使用的所有ArrayCollections,所以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。
谢谢您的帮助。
下面是详细描述项目渲染器的屏幕截图,因为它应该起作用(因为我已经修复了测量以在测量之前以显式当前宽度强制验证标签):
非常宽的列,没有滚动条,标签测量的高度显示在行高中
较小的宽度列,某些渲染器已达到最大高度并创建滚动条,最后一个渲染器仍在使用标签的测量高度
更小的列,所有最大高度被击中,滚动条出现在所有标签上,滚动条将在使用时选择该行,但允许滚动,因此所有文本均可查看。
在今天上午仔细检查之后,DataGroup渲染器的meausre方法本身并没有在第一次通过测试时验证其子项的大小。
我需要这些项目中的标签具有有限的宽度,以便它们能够适当地进行文字打包,所以当我测量DataGroup行时,需要设置每个子项的宽度,然后测量子项。 问题是validateSize()没有正确地验证元素的大小(标签没有被更新并在此时生成新的文本行)。 所有后续的测量通过已经有一个宽度验证给每个孩子,所以再次测量他们是正确的。 因此,在调整网格大小时,后续的度量调用起作用。
我采取强行验证DataGroup的度量方法中的每个孩子,现在正在返回正确的高度,因此AdvancedDataGrid现在正在对其行的行进行acacally调整大小。
这可能是相当低效的,因为每个项目现在每次生命周期通过两次验证,但网格按照期望执行。
可能与ScrollingLabelItemRenderer类似,标签在第一次测量自身时可能得不到宽度验证,从而设置网格接受并用作行高的错误测量大小。
我现在再次正确运行ScrollingLabelItemRenderer,我不得不强制将宽度应用于标签并在测量渲染器时对其进行验证,因为在之后的updateDisplayList中应用新宽度之前,仍然使用其先前的宽度和文本行。 。
override protected function measure():void
{
label.width = getExplicitOrMeasuredWidth() - verticalScrollBar.getExplicitOrMeasuredWidth();
label.validateNow();
super.measure();
}
我花了几个星期的时间试图让MX AdvancedDataGrid
正确处理变量行高,错误并没有真正成功。 有些情况下高度不正确。 所有这些都是关于调用网格渲染器重新布局,这是一个非常漫长的操作,使得项目非常缓慢。
我建议你移动到基于Spark DataGrid
Spark AdvancedDataGrid
,并为复杂的渲染器工作得更快 。
上一篇: ItemRenderer height (and height changes) not reflected in AdvancedDataGrid row