Spark:自动设置滚动到列表末尾不能正常工作

时间:2010-09-21 14:02:13

标签: flex flex4 flex-spark

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


1 个答案:

答案 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();
 }
}

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