2010-10-06 51 views
1

我有一個由ArrayCollection爲其dataProvider支持的Spark List(spark.components.List)。當有太多的行要顯示時,List有一個垂直滾動條。我想要的是當一個新行被添加到列表中以便滾動到底部以顯示新行時。當添加新數據時,Flex Spark List滾動到底部

我試着從ArrayCollection的偵聽器調用List的ensureIndexIsVisible。這不起作用,因爲列表尚未完全呈現新行。它要麼滾動到倒數第二行,或者拋出該異常:

Error: invalidIndex 
at spark.layouts.supportClasses::LinearLayoutVector/start()[E:\dev\4.0.0\frameworks\projects\spark\src\spark\layouts\supportClasses\LinearLayoutVector.as:893] 
at spark.layouts.supportClasses::LinearLayoutVector/getBounds()[E:\dev\4.0.0\frameworks\projects\spark\src\spark\layouts\supportClasses\LinearLayoutVector.as:1117] 
at spark.layouts::VerticalLayout/getElementBounds()[E:\dev\4.0.0\frameworks\projects\spark\src\spark\layouts\VerticalLayout.as:852] 
at spark.layouts.supportClasses::LayoutBase/http://www.adobe.com/2006/flex/mx/internal::getScrollPositionDeltaToElementHelper()[E:\dev\4.0.0\frameworks\projects\spark\src\spark\layouts\supportClasses\LayoutBase.as:1367] 
at spark.layouts.supportClasses::LayoutBase/getScrollPositionDeltaToElement()[E:\dev\4.0.0\frameworks\projects\spark\src\spark\layouts\supportClasses\LayoutBase.as:1348] 
at spark.components::List/ensureIndexIsVisible()[E:\dev\4.0.0\frameworks\projects\spark\src\spark\components\List.as:2105] 

我確信,我的聽衆是設置列表的dataProvider之後添加到ArrayCollection中。希望在List有機會處理新行後,我會打電話給ensureIndexIsVisible。我的猜測是列表不會呈現該行,直到稍後發生的某個重繪事件(在我調用ensureIndexIsVisible之後)。

我也試過指定一個VerticalLayout並將它的verticalScrollPosition設置爲過大的數字(如99999)。這有同樣的問題 - 它滾動到最後一行的第二個問題。

那麼,有沒有辦法滾動到Spark列表中新添加的行?我唯一能在互聯網上找到的是poorly formatted flexcoders thread

+0

您是否嘗試在'callLater'中調用'ensureIndexIsVisible()'?像'callLater(function():void {ensureIndexIsVisible(lastIndex)});' – 2010-10-07 18:04:08

+0

是的,我試過了,它不起作用,顯然callLater沒有足夠晚的時間被調用。我確實使用了setTimeout,它確實有效,但這非常不合理。 – 2010-10-07 18:39:16

回答

1

我的解決辦法是擴展List並覆蓋updateDisplayList,它的工作原理:在Adobe's forums

protected override function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void 
{ 
    super.updateDisplayList(unscaledWidth, unscaledHeight); 
    // call ensureIndexIsVisible here 
} 

見討論。

+0

這隻有時有效,你需要等待大約.03秒來調用這個,setTimeout的工作原理,但可能你需要一個CallLater工具類來處理這個。如果你需要一個能夠很好地工作的消息,給我發消息... – JTtheGeek 2010-12-01 23:47:45

+0

'callLater(myList.ensureIndexIsVisible,[myData.length - 1])在某些情況下仍然會拋出異常 – 2012-11-03 10:17:00

4

而是爲了覆蓋updateDisplayList延長List的,我說我的List分量的監聽器FlexEvent.UPDATE_COMPLETE和它的作品對我蠻好。

1

我發現,當ensureIndexIsVisible直接在插入到列表dataProvider後運行時,它不會精確地拉取列表中最後一項的位置。這看起來是因爲綁定沒有機會更新列表。對我來說最快的解決方案是在ensureIndexIsVisible上運行callLater。

_acGuestBookMessages.addItemAt(obj, _acGuestBookMessages.length); 
var arr:Array = [_acGuestBookMessages.length-1]; 
callLater(lstGuestBookMessages.ensureIndexIsVisible, arr); 
0
if(itemsList && itemsList.scroller && 
    itemsList.scroller.verticalScrollBar && 
    itemsList.scroller.verticalScrollBar.visible){ 

     itemsList.scroller.verticalScrollBar.value = 
      itemsList.scroller.verticalScrollBar.maximum; 

} 
+0

有點解釋會讓你的帖子更有價值;) – ForceMagic 2012-10-22 02:40:58

0

有同樣的問題,這對我的作品 -

if(chatCollection.length > 0) 
{ 
    chatList.validateNow(); 
    chatList.ensureIndexIsVisible(chatCollection.length - 1); 
} 
1

要滾動到更新的火花列表的底部,並 ensureIndexIsVisible太多無證麻煩? 我得到這個被處理的名單dataGroup時財產的物理高度工作...

function newMessage(...) 
{ 
    messages.addItemAt(msg, messages.length);    
    messages.refresh(); 
    scrollToBottom(); 
} 

function scrollToBottom():void 
{ 
    messagesList.addEventListener("updateComplete", scrollUpdate); 
} 

private function scrollUpdate(e:Event):void 
{ 
    messagesList.removeEventListener("updateComplete", scrollUpdate); 
    messagesList.dataGroup.verticalScrollPosition = messagesList.dataGroup.contentHeight - messagesList.dataGroup.height; 
} 
0

你爲什麼不使用這樣的:

SysLog.verticalScrollPosition = log.length-1; 

? 它爲我工作;

相關問題