1

我正在使用以下 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();
    }


4

1 回答 1

3

最后,我发现了一个hack。问题是由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();
 }
}

如果其他人找到更好的解决方案,我会接受他的回答。

于 2010-09-23T08:47:20.193 回答