Scorri fino all'elemento selezionato nel componente Flex 4 Spark List
-
05-07-2019 - |
Domanda
Sto impostando l'elemento selezionato in s: Componente Elenco con Actionscript, funziona, ma Elenco non scorre fino all'elemento selezionato - è necessario scorrere con la barra di scorrimento o il mouse. È possibile scorrere automaticamente verso l'elemento selezionato? Grazie!
Soluzione
Prova il metodo s: List
sureIndexIsVisible (index: int): void .
Altri suggerimenti
Per Spark:
list.ensureIndexIsVisible (indice);
Questa funzione scorrerà in cima all'elenco in Flex 4+. Tiene conto dell'altezza dell'elemento, quindi funzionerà per elenchi con elementi diversi con altezza diversa.
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);
}
In flex-3 esiste un metodo scrollToIndex
e quindi puoi chiamare
list.scrollToIndex(list.selectedIndex);
Credo che dovrebbe funzionare anche in Flex-4.
Questo ha funzionato per me. ho dovuto usare callLater.
list.selectedItem = "MyTestItem"; //or list.selectedIndex = 10;
this.callLater(updateIndex); //dispatch an update to list
private function updateIndex():void {
list.ensureIndexIsVisible(list.selectedIndex);
}
Ho visto questa idea di base qui ... http://arthurnn.com/blog/2011/ 12/01 / coverflow-layout per i-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();
}
Probabilmente vorrai accedere direttamente allo scroller dell'elenco e fare qualcosa del tipo:
list.scroller.scrollRect.y = list.itemRenderer.height * index;
Puoi moltiplicare l'altezza di un elemento per il suo indice e passare questo valore a:
yourListID.scroller.viewport.verticalScrollPosition
È un bug: puoi vedere la dimostrazione e una soluzione alternativa alla https: / /issues.apache.org/jira/browse/FLEX-33660
Questa estensione del componente Elenco personalizzato ha funzionato per me:
<s:List
xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
valueCommit="callLater(ensureIndexIsVisible, [selectedIndex])">
</s:List>
Di recente l'ho realizzato in uno dei miei progetti avendo una dimensione definita per i miei articoli nel gruppo ..
<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>
In seguito a ciò i miei controlli del pulsante per la manipolazione hanno funzionato incrementando un "targetindex" privato variabile, quindi ho chiamato una funzione checkAnimation, che utilizzava la classe Animate, in combinazione con un SimpleMotionPath e un confronto tra tutpane.firstIndexInView e indice di destinazione. Ciò ha modificato la "posizione orizzontaleScroll". del gruppo.
Ciò ha permesso ai controlli separati di fungere essenzialmente da barra di scorrimento, ma avevo il requisito di far scorrere il controllo per visualizzare l'elemento selezionato. Credo che questa tecnica potrebbe funzionare anche per la selezione automatizzata degli elementi