簡體   English   中英

添加新數據時,Flex Spark List滾動到底部

[英]Flex Spark List scroll to bottom when new data is added

我有一個ArrayCollection作為其dataProvider支持的Spark List( spark.components.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]

在設置List的dataProvider之后,我確保將我的偵聽器添加到ArrayCollection中。 希望是在List有機會處理新行之后,我將調用ensureIndexIsVisible 我的猜測是,List不會渲染行,直到稍后發生一些重繪事件為止(在我將其稱為ensureIndexIsVisible )。

我也嘗試指定一個VerticalLayout並將其verticalScrollPosition設置為一個太大的數字(例如99999)。 這有同樣的問題-它從最后一行滾動到第二行。

那么,有沒有辦法滾動到Spark List中新添加的行? 我在互聯網上唯一能找到的是格式不佳的flexcoders線程

我沒有擴展List來覆蓋updateDisplayList ,而是在List組件上向FlexEvent.UPDATE_COMPLETE添加了一個偵聽器,它對我來說很好用。

是否要滾動到更新的清單的底部並確保IndexIsVisible太多未記錄的問題? 我通過處理List上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;
}

我的解決方案是擴展List並覆蓋updateDisplayList ,它的工作原理是:

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

請參閱Adobe論壇的討論

我發現,在將insertIndexIsVisible插入列表dataProvider后直接運行時,它不能准確地提取列表中最后一項的位置。 這似乎是因為綁定沒有機會更新列表。 對我而言,最快的解決方案是在sureIndexIsVisible上運行callLater。

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

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

}

遇到同樣的問題,這對我有用-

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM