![](/img/trans.png)
[英]How do I programmatically scroll to the end of a Flex Spark Textarea when a new line is added?
[英]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;
}
我發現,在將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.