У меня есть 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();
}
}