2009-10-21 7 views
26

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

ответ

23

Try в s:List метод ensureIndexIsVisible(index:int):void.

+0

Спасибо, но, похоже, работает только в последних версиях Flex 4 SDK (Flex Builder 4 Beta 2). Я понял, что работаю с одним из старых сборников, у которого пока нет этого метода. –

+1

это также прокручивается так, чтобы верх элемента был виден, если элемент высок, это не прокручивается до нижней части. – JTtheGeek

+0

@JTtheGeek. Да, в Spark List 4.6 кажется, что вы должны дважды щелкнуть, чтобы прокрутить вниз. – Nemi

3

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

list.scrollToIndex(list.selectedIndex); 

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

+0

К сожалению, нет. В Spark List такого метода нет, но он есть для компонента Halo List. Flex 4 развивается и все еще находится в бета-версии, надеюсь, что эта проблема будет решена. –

2

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

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

+0

Я обнаружил, что вы не можете напрямую изменить значение внутри scrollRect, вместо этого вам нужно обновить scrollRect новым прямоугольником?как [this] (http://www.actionscript.org/forums/showthread.php3?t=190795) – eldamar

1

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

yourListID.scroller.viewport.verticalScrollPosition 
0

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

<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 и Тарг et index. Это изменило «horizontalScrollPosition» группы.

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

2

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

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

     } 
    } 
} 
4
//try this 
this.callLater(updateIndex);//where you want to set the selectedIndex 

private function updateIndex():void 
{ 
    list.selectedIndex = newIndex; 
    list.ensureIndexIsVisible(newIndex); 
} 
+1

Более короткая версия: 'callLater (list.ensureIndexIsVisible, [list.selectedIndex])', но все же не лучшее решение - иногда вызывает индексы вне диапазона ошибок –

2

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

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

private function updateIndex():void { 
    list.ensureIndexIsVisible(list.selectedIndex); 
} 
1

Этот обычай расширение списка компонент работал для меня:

<s:List 
    xmlns:fx="http://ns.adobe.com/mxml/2009" 
    xmlns:s="library://ns.adobe.com/flex/spark" 
    valueCommit="callLater(ensureIndexIsVisible, [selectedIndex])"> 
</s:List> 
Смежные вопросы