2011-12-20 1 views
-2

У меня есть s: Список в моем приложении flex, прикрепленном к ArrayCollection (элементы). Я хочу изменить позицию одного элемента, так что на самом деле я меняю его индекс элемента, вопрос в том, как это делать?Flex 4: изменить позицию элемента в s: Список

Вот лучший пример:

Пункт 1 я: 1 пункт 2 я: 2 пункт 3 я: 3 пункт 4 я: 4

я = индекс

Внутри предмета есть кнопка с надписью «Вверх», когда я, например, на нее накладываю на элемент 3, это становится следующим:

позиция 1 i: 1пункт 3 я: 2 пункт 2 я: 3 пункт 4 я: 4

Так как мы видим, у нас есть новый индекс для пункта 3 ...

Как я могу добиться этого в actionscript и увидеть, что элемент перемещен в интерфейсе.

Thx!

+2

Я не знаю, почему вы не публикуете информацию о том, что вы пробовали. Этот вопрос выглядит так, будто вы пытаетесь заставить других выполнять свою работу за вас. Прочитайте [faq], такие вопросы НЕ оцениваются –

ответ

1

Первое, что вы должны сделать, когда вы увидели ArrayCollection прилагается виден DOCUMENTATION

Вы бы видели, что у него есть такие методы, как addItemAt и removeItemAt

Так что очевидно, что нужно сделать было бы:

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 будет переплетены в свой список, я бы изменить 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

В приведенном выше ответе, задав выбранный элемент списка выбранному Obj вместо того, чтобы устанавливать выбранное значениеIndex из списка в newPos, нам не нужно явно изменять или поддерживать любой выбор в 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;) 
      } 
     } 
Смежные вопросы