我正在使用以下mxml代码来显示某些数据的列表。我构建了一个可以具有可变高度的自定义渲染器。每次新数据到达时,滚动条都应该到达列表的末尾。我注册了触发数组更改的事件。
如果物品的高度相同,它的工作正常。但是如果没有发生这种情况,那么卷轴就会在结束时稍微过一点。
如果列表中间的项目高度较大,则最后的项目不可见。
你能给我一些解决这个问题的提示吗?
<s:Scroller width="100%" height="100%" id="scroller" horizontalScrollPolicy="off">
<s:DataGroup
id = "lstComments"
width = "100%"
height = "100%"
clipAndEnableScrolling = "true"
itemRenderer = "myCustomRenderer">
<s:layout>
<s:VerticalLayout
id = "vLayout"
useVirtualLayout = "true"
gap = "2"
variableRowHeight = "true"
horizontalAlign = "left"
verticalAlign = "top"
paddingTop = "0"
paddingBottom = "0" />
</s:layout>
</s:DataGroup>
</s:Scroller>
private function onArrayChange(event:CollectionEvent):void
{
switch(event.kind) {
case CollectionEventKind.ADD:
{
callLater(scrollDown);
break;
}
}
}
private function scrollDown():void
{
scroller.verticalScrollBar.value = scroller.viewport.contentHeight - scroller.viewport.height;
scroller.invalidateProperties();
}
答案 0 :(得分:3)
最后,我找到了一个黑客。问题是由scroller.viewport.contentHeight
引起的。调用方法scrollDown
时,计算不正确。
所以,为了解决这个问题,在我创建scroller
之后我注册了FlexEvent.UPDATE_COMPLETE
事件。
处理此事件的方法:
private function onUpdateCompleteScroller(event:Event):void
{
//compute the new value for the scroller
var newValue:Number = scroller.viewport.contentHeight - scroller.viewport.height;
if (scroller.verticalScrollBar.value != newValue && newValue > 0)
{
scroller.verticalScrollBar.value = scroller.viewport.contentHeight - scroller.viewport.height;
scroller.invalidateProperties();
}
}
如果其他人找到了更好的解决方案,我会接受他的回答。