Vá até o item selecionado no Flex componente List 4 faísca
-
05-07-2019 - |
Pergunta
Eu estou definindo elemento selecionado no s: componente Lista com Actionscript, ele funciona, mas lista não rolagem para item selecionado - necessidade de rolagem com a barra de rolagem ou mouse. É possível auto-scroll para um item selecionado? Obrigado!
Solução
Tente o método s:List
ensureIndexIsVisible (index: int):. vazio
Outras dicas
Para faísca:
list.ensureIndexIsVisible(index);
Esta função irá rolar para o topo da lista em Flex 4+. Leva em conta a altura do item, por isso vai trabalhar para listas com diferentes itens com altura diferente.
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;
}
}
}
//try this
this.callLater(updateIndex);//where you want to set the selectedIndex
private function updateIndex():void
{
list.selectedIndex = newIndex;
list.ensureIndexIsVisible(newIndex);
}
Em flex-3 existe um método scrollToIndex
e, portanto, você pode chamar
list.scrollToIndex(list.selectedIndex);
Eu acredito que isso deve funcionar em flex-4 também.
Isso funcionou para mim. tive que usar o callLater.
list.selectedItem = "MyTestItem"; //or list.selectedIndex = 10;
this.callLater(updateIndex); //dispatch an update to list
private function updateIndex():void {
list.ensureIndexIsVisible(list.selectedIndex);
}
Eu vi essa ideia básica aqui ... http://arthurnn.com/blog/2011/ 12/01 / 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();
}
Você provavelmente vai querer acessar scroller da lista diretamente e fazer algo como:
list.scroller.scrollRect.y = list.itemRenderer.height * index;
Você pode multiplicar a altura de um elemento por seu índice e passar esse valor para:
yourListID.scroller.viewport.verticalScrollPosition
É um erro - você pode ver a demonstração e uma solução alternativa na https: / /issues.apache.org/jira/browse/FLEX-33660
Esta lista personalizada extensão componente funcionou para mim:
<s:List
xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
valueCommit="callLater(ensureIndexIsVisible, [selectedIndex])">
</s:List>
Recentemente, realizou esta em um dos meus projetos por ter um tamanho definido para os meus artigos do grupo ..
<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>
Após este meus controles de botão para a manipulação trabalhou por incrementar uma variável privada "targetindex", então eu chamei uma função checkAnimation, que usou a classe Animate, em combinação com um SimpleMotionPath e uma comparação entre tutpane.firstIndexInView e índice de alvo. Isso modificou a "horizontalScrollPosition" do grupo.
Isto permitiu controles separados para essencialmente agir como uma barra de rolagem, mas eu tinha a exigência de deslizando o controle para exibir o item selecionado .. Eu acredito que esta técnica poderia trabalhar para selecção automática de itens, bem