Выделите выделенный элемент в компоненте Flex 4 Spark List - PullRequest
26 голосов
/ 21 октября 2009

Я устанавливаю выбранный элемент в s: Компонент List с Actionscript, он работает, но List не прокручивает до выбранного элемента - нужно прокручивать с помощью полосы прокрутки или мыши. Можно ли автоматически прокрутить до выбранного элемента? Спасибо!

Ответы [ 12 ]

23 голосов
/ 06 ноября 2009

Попробуйте метод s:List sureIndexIsVisible (index: int): void .

6 голосов
/ 26 ноября 2010

Для искры:

list.ensureIndexIsVisible(index);

4 голосов
/ 22 мая 2012
//try this
this.callLater(updateIndex);//where you want to set the selectedIndex

private function updateIndex():void
{
    list.selectedIndex = newIndex;
    list.ensureIndexIsVisible(newIndex);
}
4 голосов
/ 18 ноября 2011

Эта функция прокручивает вверх по списку в Flex 4+. Он учитывает высоту элемента, поэтому он будет работать для списков с различными элементами с разной высотой.

private function scrollToIndex(list:List,index:int):void
{
    if (!list.layout)
        return;

    var dataGroup:DataGroup = list.dataGroup;

    var spDelta:Point = dataGroup.layout.getScrollPositionDeltaToElement(index);

    if (spDelta)
    {
        dataGroup.horizontalScrollPosition += spDelta.x;
        //move it to the top if the list has enough items
        if(spDelta.y > 0)
        {
            var maxVSP:Number = dataGroup.contentHeight - dataGroup.height;
            var itemBounds:Rectangle = list.layout.getElementBounds(index);
            var newHeight:Number = dataGroup.verticalScrollPosition + spDelta.y 
            + dataGroup.height - itemBounds.height;
            dataGroup.verticalScrollPosition = Math.min(maxVSP, newHeight);
        }
        else
        {
            dataGroup.verticalScrollPosition += spDelta.y;

        }
    }
}
3 голосов
/ 27 июня 2013

Это сработало для меня. пришлось использовать callLater.

list.selectedItem = "MyTestItem"; //or list.selectedIndex = 10;
this.callLater(updateIndex); //dispatch an update to list

private function updateIndex():void {
    list.ensureIndexIsVisible(list.selectedIndex);
}
3 голосов
/ 22 октября 2009

В flex-3 есть метод scrollToIndex и, следовательно, вы можете вызвать

list.scrollToIndex(list.selectedIndex);

Я считаю, что это должно работать и в flex-4.

2 голосов
/ 27 августа 2011

Я видел эту основную идею здесь ... http://arthurnn.com/blog/2011/01/12/coverflow-layout-for-flex-4/

public function scrollGroup( n : int ) : void
{
    var scrollPoint : Point = theList.layout.getScrollPositionDeltaToElement( n );
    var duration : Number = ( Math.max( scrollPoint.x, theList.layout.target.horizontalScrollPosition ) - Math.min( scrollPoint.x, theList.layout.target.horizontalScrollPosition )) * .01;
    Tweener.addTween(theList.layout,{ horizontalScrollPosition: scrollPoint.x , time:duration});
}
protected function theList_caretChangeHandler(event:IndexChangeEvent):void
{
    scrollGroup( event.newIndex );
    event.target.invalidateDisplayList();
}
2 голосов
/ 06 ноября 2009

Возможно, вы захотите получить доступ к скроллеру Списка напрямую и сделать что-то вроде:

list.scroller.scrollRect.y = list.itemRenderer.height * index;

1 голос
/ 11 апреля 2016

Это пользовательское расширение компонента List работало для меня:

<s:List
    xmlns:fx="http://ns.adobe.com/mxml/2009"
    xmlns:s="library://ns.adobe.com/flex/spark"
    valueCommit="callLater(ensureIndexIsVisible, [selectedIndex])">
</s:List>
1 голос
/ 10 августа 2013

Это ошибка - вы можете увидеть демонстрацию и обходной путь на https://issues.apache.org/jira/browse/FLEX-33660

...