можно отобразить arrayCollection of Sprites в компоненте List? - PullRequest
1 голос
/ 23 мая 2009

У меня есть arrayCollection объектов, которые расширяют Sprite, и имеют растровые изображения внутри них.

Я хочу отобразить их в списке (или каком-либо другом компоненте, который позволил бы пользователю просматривать их и просматривать связанные с ними данные.)

Когда я это сделаю: myList.dataProvider = myArrayCollection

список показывает только ряд строк [Object, Item] вместо визуальных спрайтов.

Вот упрощенная версия моего Объекта:

public class myUIC extends UIComponent
    {

        public var mySprite:Sprite = new Sprite;

        [Embed(source="assets/BGimage.png")]
        public var BGimage:Class;

        public var myBitmap:Bitmap;
        public var wordText:TextField = new TextField;

        public function myUIC(myWord:String)
        {
            this.wordText.text = myWord;
            this.myBitmap = new BGimage;
            this.mySprite.addChild(this.myBitmap);
            this.mySprite.addChild(this.wordText);
            this.addChild(this.mySprite);
        }
    }

Пробовал много разных способов заставить его отображаться в Списке, но не может сделать это.

Ответы [ 4 ]

1 голос
/ 25 мая 2009
0 голосов
/ 28 июля 2009

Здесь попробуйте использовать itemRenderer что-то вроде этого. Он должен работать с любым универсальным объектом DisplayObject. Он захватывает ширину и высоту из назначенного свойства данных, поэтому вам может потребоваться установить значение variableRowHeight в true в вашем фактическом списке, чтобы оно работало должным образом.

package
{
    import flash.display.DisplayObject;
    import mx.controls.listClasses.IListItemRenderer;
    import mx.core.UIComponent;
    import mx.events.FlexEvent;

    /*
    Extending UIComponent means we can add Sprites (or any DisplayObject)
    with addChild() directly, instead of going through the rawChildren property.
    Plus, in this case, we don't need the extra overhead of Canvas's layout code.

    IListItemRenderer lets us use it as a List's itemRenderer. UIComponent already
    implements all of IListItemRenderer except for the data property
    */
    public class SpriteRenderer extends UIComponent implements IListItemRenderer
    {
        // Implementing the data property for IListItemRenderer is really easy,
        // you can find example code in the LiveDocs for IDataRenderer
        private var _data:Object;

        [Bindable("dataChange")]
        public function get data():Object
        {
            return _data;
        }

        public function set data(value:Object):void
        {
            if (value !== _data) {

                // We need to make sure to remove any previous data object from the child list
                // since itemRenderers are recycled
                if (_data is DisplayObject && contains(_data as DisplayObject)) {
                    removeChild(_data as DisplayObject);
                }

                _data = value;

                // Now we just make sure that the new data object is something we can add
                // and add it
                if (_data is DisplayObject) {
                    this.width = (_data as DisplayObject).width;
                    this.height = (_data as DisplayObject).height;

                    addChild(_data as DisplayObject);
                }

                dispatchEvent(new FlexEvent(FlexEvent.DATA_CHANGE));
            }
        }

        public function SpriteRenderer()
        {
            super();
        }
    }
}
0 голосов
/ 21 июля 2009

попробуйте rawChildren.addChild для добавления Sprite

0 голосов
/ 23 мая 2009

Звучит так, как будто вы можете захотеть написать простой рендерер элементов (возможно, на основе UIComponent), который добавляет связанный спрайт в список отображения рендера, используя addChild ().

...