Интересно, тут ещё остались специалисты по Флексу?
Похоже окончательно технология загнулась...
Ну да ладно, просто мучаюсь который день и никак не найду приемлемого решения. Никак не разберусь как правильно организовать данные.
Итак вот есть драгабл List
Код AS3:
[Bindable] public static var posts:ArrayCollection = new ArrayCollection();
[Bindable] private var dragit:Boolean = false;
protected function lst_itemClickHandler(evt:ItemClickEvent):void {
if (evt.label == 'mousedown') {
dragit = false;
return;
}
if (evt.label == 'mouseup') {
dragit = true;
return;
}
}
<s:List id="list" width="100%" height="100%" dataProvider="{posts}" itemRenderer="postIR" selectedIndex="0" dragEnabled="{dragit}" dragMoveEnabled="true" dropEnabled="true" useVirtualLayout="false"/>
В нём итемрендерер postIR с кучей кнопок, картинок и парой других итемрендеров.
Вот postIR
Код AS3:
<?xml version="1.0" encoding="utf-8"?>
<s:ItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
xmlns:c="*"
autoDrawBackground="true" creationComplete="itemrenderer1_creationCompleteHandler(event)" maxHeight="120">
<fx:Script>
<![CDATA[
[Bindable] private var index:int;
[Bindable] private var socDP:ArrayCollection;
protected function itemrenderer1_creationCompleteHandler(event:FlexEvent):void
{
index = ((this.owner as List).dataProvider as ArrayCollection).getItemIndex(data);
socDP = Copypaste.socialVector[index] as ArrayCollection;
soc.addEventListener(ItemClickEvent.ITEM_CLICK, soc_itemClickHandler);
}
//Deleted some code
]]>
</fx:Script>
<c:CheckList id="soc" width="100%" height="100%" itemRenderer="socIR" mouseDown="txt_mouseDownHandler(event)" mouseUp="soc_mouseUpHandler(event)"
dataProvider="{socDP}" allowMultipleSelection="true" useVirtualLayout="false" click="soc_clickHandler(event)">
<c:layout>
<s:TileLayout requestedColumnCount="3" verticalAlign="top" padding="5"/>
</c:layout>
</c:CheckList>
//Deleted some code
</s:ItemRenderer>
А вот внутренний socIR
Код AS3:
<?xml version="1.0" encoding="utf-8"?>
<s:ItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
autoDrawBackground="true" click="itemrenderer1_clickHandler(event)" creationComplete="itemrenderer1_creationCompleteHandler(event)">
<s:layout>
<s:HorizontalLayout verticalAlign="middle" padding="5"/>
</s:layout>
<s:states>
<s:State name="normal"/>
<s:State name="selected"/>
</s:states>
<fx:Script>
<![CDATA[
protected function itemrenderer1_clickHandler(event:MouseEvent):void
{
if (this.selected) {
data.selected = true;
} else {
data.selected = false;
}
var parentList:List = owner as List;
var e:ItemClickEvent = new ItemClickEvent(ItemClickEvent.ITEM_CLICK, true);
e.item = data;
e.index = parentList.dataProvider.getItemIndex(data);
e.label = "selected";
dispatchEvent(e);
}
override public function set data(value:Object):void
{
super.data = value;
if (value.selected) {
data.selected = true;
} else {
data.selected = false;
}
}
protected function itemrenderer1_creationCompleteHandler(event:FlexEvent):void
{
if (data.selected) {
this.selected = true;
} else {
this.selected = false;
}
}
]]>
</fx:Script>
<s:CheckBox id="socCheck" selected.selected="true" selected.normal="false" mouseEnabled="false"/>
<s:Image source="{'images/socialicons/' + data.icon}"/>
<s:Label text="{data.label}"/>
</s:ItemRenderer>
Все отлично, все работает, но ровно до тех пор пока я не начинаю драгать итемы (смена сортировки). Все выделения в SocIR пропадают. Я создал в классе где и главный список хранилище этих выделенных данных, но все равно все путается, какой-то хаос наблюдается.
Неужели нет какой-то стройной системы для организации правильной иерархии данных?
Я пробовал в data первого итемрендерера передавать объект или ArrayCollection, но это выдает ошибки или не работает.
В общем нужен любой совет или даже доработка за деньги.