2009-10-21 7 views

Respuesta

23

Prueba el método s:ListensureIndexIsVisible(index:int):void.

+0

Gracias, pero parece funcionar solo en las versiones más recientes de Flex 4 SDK (Flex Builder 4 Beta 2). Me di cuenta de que trabajo con una de las compilaciones antiguas que todavía no tiene este método. –

+1

esto también solo se desplaza para que la parte superior del artículo esté visible, si el elemento es alto, no se desplaza hacia la parte inferior – JTtheGeek

+0

@JTtheGeek Sí, en Spark List 4.6 parece que debe hacer clic dos veces para desplazarse hasta la parte inferior. – Nemi

3

en Flex-3 no es un método scrollToIndex y por lo tanto se puede llamar

list.scrollToIndex(list.selectedIndex); 

creo que esto debería funcionar en Flex-4 también.

+0

Por desgracia, no. No existe tal método en Spark List, pero está ahí para el componente Lista de Halo. Flex 4 está evolucionando y sigue en Beta, espero que este problema se resuelva. –

2

es probable que desee acceder a la rueda de desplazamiento de la Lista directamente y hacer algo como:

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

+0

Descubrí que no puede cambiar el valor dentro de scrollRect directamente, sino que necesita actualizar scrollRect con un nuevo rectángulo.como [esto] (http://www.actionscript.org/forums/showthread.php3?t=190795) – eldamar

1

Puede multiplicar la altura de un elemento por su índice y pasar este valor a:

yourListID.scroller.viewport.verticalScrollPosition 
0

recientemente he logrado esto en uno de mis proyectos por tener un tamaño definido por mis artículos del 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> 

después de esto mis botones de control para la manipulación trabajado incrementando un "targetindex" privada variable, entonces me llama una función checkAnimation, que utiliza la clase Animate, en combinación con un SimpleMotionPath y una comparación entre tutpane.firstIndexInView y targ et index. Esto modificó la "horizontalScrollPosition" del grupo.

Esto permitió controles separados para actuar esencialmente como una barra de desplazamiento, pero no tenía el requisito de la corredera de control para ver el elemento seleccionado .. Creo que esta técnica podría funcionar para la selección automática de artículos, así

6

Para chispa:

list.ensureIndexIsVisible(index);

2

vi esta idea básica aquí ... 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

Esta función se desplazará a la parte superior de la lista en Flex 4+. Tiene en cuenta la altura del elemento, por lo que funcionará para listas con diferentes elementos con diferentes alturas.

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

Versión más corta: 'callLater (list.ensureIndexIsVisible, [list.selectedIndex])' pero aún no es la mejor solución - arroja errores de índice fuera de rango a veces –

2

Esto funcionó para mí. tuvo que usar el 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

Esta extensión componente de lista personalizada que funcionó para mí:

<s:List 
    xmlns:fx="http://ns.adobe.com/mxml/2009" 
    xmlns:s="library://ns.adobe.com/flex/spark" 
    valueCommit="callLater(ensureIndexIsVisible, [selectedIndex])"> 
</s:List> 
Cuestiones relacionadas