Spark: автоматически устанавливает скроллер в конец списка, который не работает должным образом - PullRequest
1 голос
/ 21 сентября 2010

Я использую следующий 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 Ответ

3 голосов
/ 23 сентября 2010

Наконец-то я нашел взлом. Проблема была вызвана 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();
 }
}

Если кто-то найдет лучшее решение, я приму его ответ.

...