Flex Spark List прокручивает вниз при добавлении новых данных - PullRequest
1 голос
/ 06 октября 2010

У меня есть Spark List (spark.components.List), поддерживаемый ArrayCollection для своего dataProvider.Список имеет вертикальную полосу прокрутки, когда слишком много строк для отображения.То, что я хочу, - это когда новая строка добавляется в список для ее прокрутки вниз, чтобы показать эту новую строку.

Я пытался вызвать ensureIndexIsVisible в List из прослушивателя ArrayCollection.Это не работает, потому что список еще не полностью отрисовал новую строку.Он будет либо прокручиваться до второй из последней строки, либо выдавать исключение:

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]

Я убедился, что мой слушатель добавлен в ArrayCollection после установки dataProvider в List.Надеюсь, я позвоню ensureIndexIsVisible после того, как у List появится возможность обработать новый ряд.Я предполагаю, что List не отображает строку до некоторого события перерисовки, которое происходит позже (после того, как я позвонил ensureIndexIsVisible).

Я также попытался указать VerticalLayout и установить его verticalScrollPosition слишком большое число (например, 99999).У него та же проблема - он прокручивается до второй из последней строки.

Итак, есть ли способ прокрутки до новой добавленной строки в списке искр?Единственное, что я мог найти в Интернете, - это плохо отформатированный поток флекскодеров .

Ответы [ 6 ]

4 голосов
/ 14 марта 2011

Вместо расширения List для переопределения updateDisplayList, я добавил слушателя к FlexEvent.UPDATE_COMPLETE на моем List компоненте, и он прекрасно работает для меня.

1 голос
/ 18 июня 2013

Хотите прокрутить вниз список обновлений и sureIndexIsVisible слишком много недокументированных проблем? Я получил это для работы, имея дело с физической высотой свойства dataGroup в List ...

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;
}
1 голос
/ 14 июля 2011

Я обнаружил, что когда sureIndexIsVisible запускается сразу после вставки в список dataProvider, он не точно определяет положение последнего элемента в списке.Это происходит потому, что у привязки не было возможности обновить список.Самым быстрым решением для меня было запустить callLater для sureIndexIsVisible.

_acGuestBookMessages.addItemAt(obj, _acGuestBookMessages.length);
var arr:Array = [_acGuestBookMessages.length-1];
callLater(lstGuestBookMessages.ensureIndexIsVisible, arr);
1 голос
/ 08 октября 2010

Мое решение состояло в том, чтобы расширить List и переопределить updateDisplayList, что работает:

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

См. Обсуждение на форумах Adobe .

0 голосов
/ 12 июня 2013

У меня была такая же проблема, у меня это работает -

if(chatCollection.length > 0)
{
    chatList.validateNow();
    chatList.ensureIndexIsVisible(chatCollection.length - 1);
}
0 голосов
/ 16 мая 2012
if(itemsList && itemsList.scroller && 
   itemsList.scroller.verticalScrollBar && 
   itemsList.scroller.verticalScrollBar.visible){

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

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...