Показать сообщение отдельно
Старый 26.04.2016, 18:59
Astraport вне форума Посмотреть профиль Отправить личное сообщение для Astraport Найти все сообщения от Astraport
  № 2  
Ответить с цитированием
Astraport
 
Аватар для Astraport

блогер
Регистрация: Sep 2009
Сообщений: 2,463
Записей в блоге: 2
Интересно, тут ещё остались специалисты по Флексу?
Похоже окончательно технология загнулась...

Ну да ладно, просто мучаюсь который день и никак не найду приемлемого решения. Никак не разберусь как правильно организовать данные.
Итак вот есть драгабл 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, но это выдает ошибки или не работает.
В общем нужен любой совет или даже доработка за деньги.

__________________
In Code We Trust