2009-10-21 8 views

Odpowiedz

23

spróbować metody ensureIndexIsVisible(index:int):voids:List.

+0

Dzięki, ale wygląda na to, że działa tylko w najnowszych wersjach Flex 4 SDK (Flex Builder 4 Beta 2). Zdałem sobie sprawę, że pracuję ze starą wersją, która nie ma jeszcze tej metody. –

+1

to również jest przewijane tylko w ten sposób, że góra elementu jest widoczna, jeśli przedmiot jest wysoki, to nie jest przewijany do dołu. – JTtheGeek

+0

@JTtheGeek Tak, na liście Iskry 4.0 wygląda na to, że musisz dwukrotnie kliknąć, aby przewinąć do dołu. – Nemi

3

Flex-3 istnieje metoda scrollToIndex i stąd można zadzwonić

list.scrollToIndex(list.selectedIndex); 

Wierzę, że to powinno działać w Flex-4 też.

+0

Niestety, nie. Nie ma takiej metody na Spark List, ale jest tam dla składnika listy Halo. Flex 4 ewoluuje i nadal działa w wersji Beta, mam nadzieję, że problem zostanie rozwiązany. –

2

Prawdopodobnie będziesz mieć dostęp scroller listy bezpośrednio i zrobić coś takiego:

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

+0

Zauważyłem, że nie można bezpośrednio zmienić wartości wewnątrz scrollRect, zamiast tego trzeba zaktualizować scrollRect za pomocą nowego prostokąta?jak [this] (http://www.actionscript.org/forums/showthread.php3?t=190795) – eldamar

1

można pomnożyć wysokość elementu o indeksie i przekazać tę wartość do:

yourListID.scroller.viewport.verticalScrollPosition 
0

Niedawno dokonał tego w jednym z moich projektów poprzez zdefiniowany rozmiar moich artykułów w grupie ..

<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> 

następstwie tej moich przycisków sterujących do manipulacji pracował przez zwiększający prywatny „targetindex” zmienna, a następnie zadzwoniłem funkcję checkAnimation, który używany klasę Animacja, w kombi z SimpleMotionPath i porównania tutpane.firstIndexInView i targ et index. To zmodyfikowało "horizontalScrollPosition" grupy.

Pozwoliło to oddzielne kontrole zasadniczo pełnić funkcję paska przewijania, ale miałem wymóg przesuwając sterowania, aby wyświetlić wybrany element .. Wierzę, że ta technika może pracować dla automatycznego doboru elementów oraz

6

Dla Spark:

list.ensureIndexIsVisible(index);

2

widziałem tę podstawową ideę tutaj ... 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

Ta funkcja przewinie do góry listy w programie Flex 4+. Bierze pod uwagę wysokość przedmiotu, więc będzie działać dla list z różnymi przedmiotami o różnej wysokości.

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

Krótsza wersja: 'callLater (list.ensureIndexIsVisible, [list.selectedIndex])' ale nadal nie jest najlepszym rozwiązaniem - czasami wyrzuca indeks poza zakresy błędów –

2

Ten pracował dla mnie. musiał użyć 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

Ten zwyczaj rozszerzenie komponentu Lista pracował dla mnie:

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