Я устанавливаю выбранный элемент в компоненте s: List с помощью ActionScript, он работает, но список не прокручивается до выбранного элемента - необходимо прокручивать полосой прокрутки или мышью. Возможна ли автопрокрутка к выбранному элементу? Спасибо !
Прокрутите до выбранного элемента в компоненте Flex 4 Spark List
Ответы (12)
Попробуйте s:List
метод sureIndexIsVisible (index: int): void.
Для Spark:
list.ensureIndexIsVisible(index);
Эта функция выполняет прокрутку к началу списка в 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;
}
}
}
В flex-3 есть метод scrollToIndex
, поэтому вы можете вызвать
list.scrollToIndex(list.selectedIndex);
Я считаю, что это должно работать и во flex-4.
Это сработало для меня. пришлось использовать callLater.
list.selectedItem = "MyTestItem"; //or list.selectedIndex = 10;
this.callLater(updateIndex); //dispatch an update to list
private function updateIndex():void {
list.ensureIndexIsVisible(list.selectedIndex);
}
Я увидел здесь эту основную идею ... 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();
}
Вероятно, вы захотите напрямую получить доступ к скроллеру списка и сделать что-то вроде:
list.scroller.scrollRect.y = list.itemRenderer.height * index;
Вы можете умножить высоту элемента на его индекс и передать это значение в:
yourListID.scroller.viewport.verticalScrollPosition
Это ошибка - вы можете увидеть демонстрацию и обходной путь в https://issues.apache.org/jira/browse/FLEX-33660
Это расширение настраиваемого компонента 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>
Недавно я добился этого в одном из своих проектов, установив определенный размер для моих элементов в группе.
<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" группы.
Это позволило отдельным элементам управления по существу действовать как полоса прокрутки, но у меня было требование сдвигать элемент управления для просмотра выбранного элемента. Я считаю, что этот метод может работать и для автоматического выбора элементов.
callLater(list.ensureIndexIsVisible, [list.selectedIndex])
, но все же не лучшее решение - иногда выдает ошибки индекса за пределами допустимого диапазона
- person Alexander Farber; 03.11.2012