2011-12-20 4 views
-2

ArrayCollection (요소)에 첨부 된 내 Flex 응용 프로그램의 List가 있습니다. 한 요소의 위치를 ​​변경하고 싶습니다. 사실이 항목 인덱스를 변경하고 있습니다. 문제는 이런 종류의 작업을 수행하는 방법입니다. 여기플렉스 4 : s :리스트에서 요소 위치 변경

더 좋은 예이다

항목 1 I : 1 개 항목 2 I : 2 항목 3 I : 3 항목 4 I : 4

I = 인덱스

항목 안에는 "위로"라는 버튼이 있습니다. 예를 들어 항목 3에 클립을 올리면 다음과 같이됩니다.

항목 1 i : 1항목 3 전 2 항목 2 전 3 항목 4 전 4

그래서

우리가 볼 수 있듯이, 우리는 항목 3에 대한 새로운 인덱스를 가지고 ...

나는 이것을 달성 할 수있는 방법 액션 스크립트를 사용하고 항목이 인터페이스에서 이동했는지 확인하십시오.

Thx! 당신은 당신이 addItemAtremoveItemAt

같은 방법 그렇게 할 수있는 명백한 일이 될 것를 가지고 있음을 알했을 DOCUMENTATION

을 볼 부착 된 ArrayCollection을보고

+2

왜 내가 시도한 내용을 게시하지 않는지 알 수 없습니다. 이 질문은 다른 사람들이 당신을 위해 당신의 일을하도록하려는 것처럼 보입니다. [faq] 읽기, 그런 질문은 감사하지 않습니다. –

답변

1

우선 당신은 했어야 : 당신의 ArrayCollection에이 목록에 바인더 제본 경우

private function moveUp(collection:ArrayCollection, indexToMove:int, numPlaces:int=1) { 
    var newIndex:int = indexToMove - numPlaces; 
    if(newIndex < 0) { 
     newIndex = 0; 
    } 
    var itemToMove:Object = collection.removeItemAt(indexToMove); 
    collection.addItemAt(itemToMove, newIndex); 
} 
1

,이 같은 직접있는 ArrayCollection을 변경합니다 :

<?xml version="1.0" encoding="utf-8"?> 
<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009" 
    xmlns:s="library://ns.adobe.com/flex/spark" 
    xmlns:mx="library://ns.adobe.com/flex/mx"> 

    <fx:Script> 
     <![CDATA[ 
      import mx.collections.ArrayCollection; 
      import mx.events.FlexEvent; 

      [Bindable] 
      public var elements:ArrayCollection = new ArrayCollection([ 
       {label : "item 1"}, 
       {label : "item 2"}, 
       {label : "item 3"}, 
       {label : "item 4"} 
      ]); 

      public function moveUp(event:MouseEvent):void 
      { 
       var index:Number = myList.selectedIndex; 

       if (index > 0) {     
        var obj:Object = elements.getItemAt(index); 
        var newPos:Number = index - 1; 

        elements.removeItemAt(index); 
        elements.addItemAt(obj, newPos); 

        myList.selectedIndex = newPos; 
       } 
      } 


      public function moveDown(event:MouseEvent):void 
      { 
       var index:Number = myList.selectedIndex; 

       if (index < elements.length - 1) { 
        var obj:Object = elements.getItemAt(index); 
        var newPos:Number = index + 1; 

        elements.removeItemAt(index); 
        elements.addItemAt(obj, newPos); 

        myList.selectedIndex = newPos; 
       } 
      } 

     ]]> 
    </fx:Script> 

    <s:layout> 
     <s:VerticalLayout/> 
    </s:layout> 

    <s:List id="myList" labelField="label" dataProvider="{elements}"/> 

    <s:HGroup> 
     <s:Button label="Move up" click="moveUp(event)"/> 
     <s:Button label="Move down" click="moveDown(event)"/> 
    </s:HGroup> 

</s:WindowedApplication> 

이제 부모 함수 호출 또는 사용자 지정 이벤트를 사용하여 사용자 지정 목록 항목 렌더러에서 동일한 논리를 적용 할 수 있습니다. 행운을 빕니다!

2

위의 대답에서 List의 selectedIndex를 newPos로 설정하는 대신 selectedItem을 Selected Obj로 설정하면 ArrayCollection에서 명시 적으로 선택 항목을 변경하거나 유지 관리 할 필요가 없습니다.

public function moveUp (event : MouseEvent) : void { var index : Number = myList.selectedIndex;

  if (index > 0) {     
       var obj:Object = elements.getItemAt(index); 
       var newPos:Number = index - 1; 

       elements.removeItemAt(index); 
       elements.addItemAt(obj, newPos); 

       myList.selectItem = obj; (instead of myList.selectedIndex = newPos;) 
      } 
     }