代码之家  ›  专栏  ›  技术社区  ›  Alexander Farber

用于包含XML数据的列表的自定义cellRenderer

  •  0
  • Alexander Farber  · 技术社区  · 15 年前

    我准备了一个简单的测试用例来演示我的问题-

    (应在其库中具有列表组件):

    import fl.data.*;
    import fl.controls.*;
    
    stop();
    
    var xml:XML =
        <data>
          <lobby>
            <user id="OK252342810632" name="Armen"/>
            <user id="DE6948" name="uriuri"/>
            <user id="DE6577" name="Polikari"/>
            <user id="DE7981" name="AlekseyBr"/>
            <user id="DE7880" name="alex554"/>
          </lobby>
          <game id="0"/>
          <game id="9012">
            <user id="OK10218913103" name="Yervand"/>
          </game>
          <game id="9013">
            <user id="OK305894249541" name="chabo"/>
            <user id="OK151358069597" name="Elena"/>
          </game>
          <game id="9007">
            <user id="DE7062" name="lexo"/>
          </game>
          <game id="9010">
            <user id="OK31902424355" name="Nor"/>
            <user id="VK8509030" name="Ilja"/>
            <user id="OK357833936215" name="Jaroslav"/>
          </game>
        </data>;
    
    var game:Game = new Game();
    game.x = 10;
    game.y = 10;
    game.id = xml.game.(@id=='9010').@id;
    addChild(game);
    
    var dp:DataProvider = new DataProvider(xml);
    var list:List = new List();
    list.move(Game.W + 20, 10);
    list.width  = Game.W + 20;
    list.height = stage.stageHeight/2 - 20;
    list.rowHeight = Game.H + 10;
    list.setStyle('cellRenderer', Game); 
    list.dataProvider = dp;
    addChild(list);
    

    (我的自定义单元格渲染器可以自己工作):

    package {
        import flash.display.*;
        import flash.text.*;
        import fl.controls.listClasses.*; 
    
        public class Game extends Sprite implements ICellRenderer {
            public static const W:uint = 60;
            public static const H:uint = 60;
    
            private var _id:TextField;
    
            private var _listData:ListData;
            private var _data:Object;
            private var _selected:Boolean;
    
            public function Game() {
                mouseChildren = false;
                buttonMode = true;
    
                var rect:Shape = new Shape();
                rect.graphics.beginFill(0x6666FF);
                rect.graphics.drawRect(0, 0, W, H); 
                rect.graphics.endFill();
                addChild(rect);
    
                _id = new TextField();
                addChild(_id);
            }
    
            public function set id(str:String):void {
                _id.text = '#' + str;
                _id.x = (W-_id.textWidth)/2;
                _id.y = (H-_id.textHeight)/2;
            }
    
            public function get id():String {
                return _id.text;
            }
    
            public function update(xml:XML):void {
                id = xml.@id;
            }   
    
            public function set listData(d:ListData):void {
                _listData = d;
            }
    
            public function get listData():ListData {
                return _listData;
            }
    
            public function set data(d:Object):void {
                trace(d);
                _data = d;
            }
    
            public function get data():Object {
                return _data;
            }
    
            public function get selected():Boolean {
                return _selected;
            }
    
            public function set selected(sel:Boolean):void {
                _selected = sel;
            }
    
            public function setMouseState(state:String):void {
            }
    
            public function setSize(width:Number, height:Number):void {
            }
        }
    }
    

    截图 alt text

    正如您所看到的,一个独立的游戏显示正常,但作为列表组件中的cellRenderer它失败了-我不知道如何设置列表项的id。

    请告诉我怎么修

    谢谢您, 亚历克斯

    更新 :

     public function set data(d:Object):void {
           _data = d;
           id = d.id;
       }
    

    1 回复  |  直到 15 年前
        1
  •  1
  •   Claus Wahlers    15 年前
    1. 代替中的trace语句游戏.as,输入: id = d.id;

    2. 您可能只想将游戏节点传递到dataprovider:

      var games:XML = <games/>;
      games.appendChild(xml.game);
      var dp:DataProvider = new DataProvider(games);
    3. var games:Array = [];
      for each(var g:XML in xml.game) { games.push({ id: g.@id, users: g.user }); }
      var dp:DataProvider = new DataProvider(games);
      然后您可以访问用户,例如:
      var users:XMLList = d.user;
      for each(var u:XML in users) {
          trace(u.@id, u.@name);
      }