2009-10-21 25 views

Trả lời

23

Thử s:List phương pháp ensureIndexIsVisible(index:int):void.

+0

Cảm ơn, nhưng có vẻ như chỉ hoạt động trong phiên bản Flex 4 SDK mới nhất (Flex Builder 4 Beta 2). Tôi nhận ra rằng tôi làm việc với một trong những bản dựng cũ chưa có phương pháp này. –

+1

điều này cũng chỉ cuộn để phần trên cùng của mục hiển thị, nếu mục đó cao thì không cuộn xuống dưới cùng – JTtheGeek

+0

@JTtheGeek Có, trong Danh sách Spark 4.6 có vẻ như bạn phải bấm hai lần để cuộn xuống dưới. – Nemi

3

Trong flex-3 có một phương pháp scrollToIndex và do đó bạn có thể gọi

list.scrollToIndex(list.selectedIndex); 

Tôi tin rằng điều này sẽ làm việc trong flex-4 quá.

+0

Thật không may, không có. Không có phương pháp như vậy trong Danh sách Spark, nhưng nó có cho thành phần Danh sách Halo. Flex 4 đang phát triển và vẫn đang trong giai đoạn Beta, hy vọng vấn đề này sẽ được giải quyết. –

2

Bạn có lẽ sẽ muốn truy cập scroller của Danh sách trực tiếp và làm điều gì đó như:

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

+0

Tôi thấy rằng bạn không thể thay đổi giá trị bên trong scrollRect trực tiếp, thay vào đó bạn cần cập nhật scrollRect bằng hình chữ nhật mới?như [this] (http://www.actionscript.org/forums/showthread.php3?t=190795) – eldamar

1

Bạn có thể nhân chiều cao của một phần tử bằng chỉ số của nó và vượt qua giá trị này:

yourListID.scroller.viewport.verticalScrollPosition 
0

Gần đây tôi đã thực hiện điều này trong một trong những dự án của tôi bằng cách có kích thước xác định cho chi của tôi trong nhóm ..

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

Tiếp theo tôi đây các nút điều khiển cho các thao tác làm việc bằng cách tăng một "targetindex" private biến, sau đó tôi gọi một hàm checkAnimation, mà sử dụng lớp Animate, trong combo với một SimpleMotionPath và so sánh giữa tutpane.firstIndexInView và targ et index. Điều này đã sửa đổi "horizontalScrollPosition" của nhóm.

Điều này cho phép điều khiển riêng biệt để về cơ bản đóng vai trò như một thanh cuộn, nhưng tôi đã yêu cầu trượt điều khiển để xem các sản phẩm được chọn .. Tôi tin rằng kỹ thuật này có thể làm việc để lựa chọn tự động các mặt hàng cũng

6

Đối Spark:

list.ensureIndexIsVisible(index);

2

tôi thấy ý tưởng cơ bản này ở đây ... 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

Chức năng này sẽ cuộn lên đầu danh sách trong Flex 4+. Nó có tính đến chiều cao của mục, vì vậy nó sẽ làm việc cho các danh sách với các mục khác nhau với chiều cao khác nhau.

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

Phiên bản ngắn hơn: 'callLater (list.ensureIndexIsVisible, [list.selectedIndex])' nhưng vẫn không phải là giải pháp tốt nhất - đôi khi chỉ ra các lỗi phạm vi –

2

này đã làm việc cho tôi. đã phải sử dụng 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

mở rộng Danh sách thành phần tùy chỉnh này đã làm việc cho tôi:

<s:List 
    xmlns:fx="http://ns.adobe.com/mxml/2009" 
    xmlns:s="library://ns.adobe.com/flex/spark" 
    valueCommit="callLater(ensureIndexIsVisible, [selectedIndex])"> 
</s:List> 
Các vấn đề liên quan