AS3 / Flex 4 Datagroup Пользовательский Itemrenderer Видео объект - PullRequest
0 голосов
/ 13 сентября 2011

У меня есть dataGroup с пользовательским видео и аудио потоком itemRenderer и провайдером данных пользователей.Кстати, проект был приложением для видеоконференций.Вот мои вопросы:

В списке 2 пользователя, w / c - dataProvider группы данных.

array[0] = user1;
array[1] = user2;

, когда user1 выходит из комнаты, user2 занимает позицию user1.Таким образом, это будет выглядеть так:

array[0] = user2;

Проблема в том, что обработчик элементов в массиве [0] остается, а обработчик элементов в массиве [1] пропадает.Итак, похоже, что user2 был тем, кто вышел из комнаты, а не user1.

Я исправил проблему, обновив / обновив / обновив список так, чтобы элементендер обновлялся, вот мой код:

private function restoreCameras():void{
    //backup the current itemrenderer
            _stored_itemrenderer = dgUsers.itemRenderer;
    //nullify all the contents of the dataGroup
            dgUsers.dataProvider = null;
            dgUsers.itemRenderer = null;
    //restore the dataGroup's dataProvider, for refreshing the data
            dgUsers.dataProvider = userArrayList;
    //restore the itemrenderer backup
            dgUsers.itemRenderer = _stored_itemrenderer;
}

с моим подходом все в порядке?И я также использую эту функцию для обновления канала камеры (w / c - элемент itemrederer).Но при обновлении аудио / видео подача складывается.Любое предложение для этого?

Спасибо, Гилберт


Ну вот DataGroup:

<s:DataGroup id="dgUsers"<br> width="320" top="155" itemRenderer="com.classroom.videoconference.videoRenderer"> <s:layout> <s:TileLayout horizontalGap="1" orientation="rows"/> </s:layout> </s:DataGroup>


Вот пользовательский ItemRenderer:

<fx:Script>
    <![CDATA[
        import mx.events.CloseEvent;
        import spark.components.DataGroup;

        private function closeVideopod(e:CloseEvent):void{
            var parentDG:DataGroup = owner as DataGroup;
            parentDG.dataProvider.removeItemAt(parentDG.dataProvider.getItemIndex(data));
            //(parentDG.dataProvider as ArrayCollection).refresh();
            this.removeChild(vidpod);
            vidpod.removeAllElements();
        }

    ]]>
</fx:Script>
<s:states>
    <s:State name="normal"/>
    <s:State name="hovered"/>
</s:states>

<s:layout>
    <s:TileLayout/>
</s:layout> 
<videoconference:Videopod id="vidpod" width="151" height="143" userItem="{data}" toolTip="{data.name}" close="closeVideopod(event)"/>

Вот поставщик данных:

 var userObj:Object = userListSO.data.testArr;
var userArray:Array = userObj.Name;
var rolesArray:Array = userObj.Role;
var statusArray:Array = userObj.Status;
var userRenderAC:ArrayCollection = new ArrayCollection();

for(var x:int = 0; x < userArray.length; x++){
    userRenderAC.addItem({
        name: userArray[x],
        role: rolesArray[x],
        status: statusArray[x]
    });

}

this.userArrayList = userRenderAC;dgUsers.dataProvider = this.userArrayList;


Вот обработчик выхода:

private function alertExitHandler(e:CloseEvent):void{
            if(e.detail == Alert.YES){
                var userObj:Object = new Object();

                var obj:Object = userListSO.data.testArr;
                var userList:Array = obj.Name;
                var rolesArray:Array = obj.Role;
                var statusArray:Array = obj.Status;

                var updatedUserList:Array = new Array();
                var updatedRolesList:Array = new Array();
                var updatedStatusList:Array = new Array();


                for(var ctr:int = 0; ctr < userList.length; ctr++) {
                    var sessionName:String = userDetails.username;
                    var listName:String = userList[ctr];

                    if(listName != sessionName) {
                        updatedUserList.push(listName);
                        updatedRolesList.push(rolesArray[ctr]);
                        updatedStatusList.push(statusArray[ctr]);
                    }
                }

                userObj.Name = updatedUserList;
                userObj.Role = updatedRolesList;
                userObj.Status = updatedStatusList;
                //here is the updated propery testarr...
                userListSO.setProperty("testArr", userObj);

                setTimeout(logout,500);
            }else{
                //logout();
            }

        }
...