Прокрутите до выбранного элемента в компоненте Flex 4 Spark List

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


person Rodion Bykov    schedule 21.10.2009    source источник


Ответы (12)


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

person an0nym0usc0ward    schedule 06.11.2009
comment
Спасибо, но похоже, что он работает только в последних сборках Flex 4 SDK (Flex Builder 4 Beta 2). Я понял, что работаю с одной из старых сборок, в которой еще нет этого метода. - person Rodion Bykov; 14.11.2009
comment
это также прокручивается только так, чтобы была видна верхняя часть элемента, если элемент высокий, он не прокручивается вниз - person JTtheGeek; 02.12.2010
comment
@JTtheGeek Да, в Spark List 4.6 кажется, что вам нужно дважды щелкнуть, чтобы прокрутить вниз. - person Nemi; 17.01.2014

Для Spark:

list.ensureIndexIsVisible(index);

person Yozef    schedule 26.11.2010

Эта функция выполняет прокрутку к началу списка в 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;

        }
    }
}
person Heitara    schedule 18.11.2011

В flex-3 есть метод scrollToIndex, поэтому вы можете вызвать

list.scrollToIndex(list.selectedIndex);

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

person Amarghosh    schedule 22.10.2009
comment
К сожалению нет. В Spark List такого метода нет, но он есть для компонента Halo List. Flex 4 развивается и все еще находится в стадии бета-тестирования, надеюсь, эта проблема будет решена. - person Rodion Bykov; 29.10.2009

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

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

private function updateIndex():void {
    list.ensureIndexIsVisible(list.selectedIndex);
}
person JJ_Coder4Hire    schedule 26.06.2013

Я увидел здесь эту основную идею ... 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();
}
person Gotta Getmedat    schedule 27.08.2011

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

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

person shi11i    schedule 06.11.2009
comment
Я обнаружил, что вы не можете напрямую изменить значение внутри scrollRect, вместо этого вам нужно обновить scrollRect с новым прямоугольником? например, это - person eldamar; 06.07.2011

Вы можете умножить высоту элемента на его индекс и передать это значение в:

yourListID.scroller.viewport.verticalScrollPosition
person Community    schedule 08.11.2009

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

person Alexander Farber    schedule 10.08.2013

Это расширение настраиваемого компонента 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>
person Philip Keiter    schedule 11.04.2016

Недавно я добился этого в одном из своих проектов, установив определенный размер для моих элементов в группе.

<s:Scroller x="940" y="0" maxHeight="465" maxWidth="940" horizontalScrollPolicy="off" verticalScrollPolicy="off">
  <s:HGroup  id="tutPane" columnWidth="940" variableColumnWidth="false" gap="0" x="0" y="0">
  </s:HGroup>
</s:Scroller>

После этого мои кнопки управления для манипуляции работали путем увеличения частной переменной targetindex, затем я вызвал функцию checkAnimation, которая использовала класс Animate, в сочетании с SimpleMotionPath и сравнением между tutpane.firstIndexInView и целевым индексом. Это изменило "horizontalScrollPosition" группы.

Это позволило отдельным элементам управления по существу действовать как полоса прокрутки, но у меня было требование сдвигать элемент управления для просмотра выбранного элемента. Я считаю, что этот метод может работать и для автоматического выбора элементов.

person Method    schedule 17.11.2009

person    schedule
comment
Более короткая версия: callLater(list.ensureIndexIsVisible, [list.selectedIndex]), но все же не лучшее решение - иногда выдает ошибки индекса за пределами допустимого диапазона - person Alexander Farber; 03.11.2012