0

次のようTwoLabelCellに拡張されたクラスを使用して2つのラベルラベルフィールドを作成することにより、単純な2つのラベル付きリストを作成しようとしています。AlternatingCellRenderer

package views
{
    import flash.text.TextFormat;

    import qnx.fuse.ui.listClasses.AlternatingCellRenderer;
    import qnx.fuse.ui.text.Label;

    public class TwoLabelCell extends AlternatingCellRenderer {
        private var description:Label;
        private var labelFormat:TextFormat;
        private var text:String;

        public function TwoLabelCell(labelText:String) {
            this.text = labelText;
        }

        override protected function init():void {
            super.init();

            labelFormat = new TextFormat();
            labelFormat.color = 0x777777;
            labelFormat.size = 17;

            description = new Label();
            description.x = 17;
            description.y = 33;
            description.format = labelFormat;
            description.text = text;

            this.addChild(description);
        }
    }
}

これは当時の単なるテストであるため、1つのラベルのみを使用していることを忘れないでください(この質問を理解した後、もう1つを追加し、同じロジックを使用します)。ここでの主なアイデアは、これを呼び出すとtext、作成時にリストのラベルのテキストを変更するために使用される変数を設定するということです。さて、ここにメインアプリケーションファイルがあります:

package {
    import flash.display.Sprite;

    import qnx.fuse.ui.events.ListEvent;
    import qnx.fuse.ui.listClasses.List;
    import qnx.fuse.ui.listClasses.ListSelectionMode;
    import qnx.fuse.ui.listClasses.ScrollDirection;
    import qnx.ui.data.DataProvider;

    import views.TwoLabelCell;

    [SWF(height="600", width="1024", frameRate="30", backgroundColor="#FFFFFF")]
    public class PackTrack extends Sprite {
        private var packList:List;

        public function PackTrack() {
            super();

            initializeUI();
        }

        private function initializeUI():void {
            packList = new List();
            packList.setPosition(0, 0);
            packList.width = 310;
            packList.height = 400;
            packList.rowHeight = 50;
            packList.selectionMode = ListSelectionMode.SINGLE;
            packList.scrollDirection = ScrollDirection.VERTICAL;

            var arrMonth:Array=[];
            arrMonth.push({label: "January"});
            arrMonth.push({label: "February"});
            arrMonth.push({label: "March"});
            arrMonth.push({label: "April"});
            arrMonth.push({label: "May"});
            arrMonth.push({label: "June"});
            arrMonth.push({label: "July"});
            arrMonth.push({label: "August"});
            arrMonth.push({label: "September"});
            arrMonth.push({label: "October"});
            arrMonth.push({label: "November"});
            arrMonth.push({label: "December"});

            packList.dataProvider = new DataProvider(arrMonth);
            packList.cellRenderer = TwoLabelCell("Testing Label");

            packList.addEventListener(ListEvent.ITEM_CLICKED, onListClick);

            this.addChild(packList);
        }

        private function onListClick(event:ListEvent):void {
            trace("Item clicked: " + event.data.label);
            trace("Index clicked: " + event.index);
        }
    }
}

これを実行しようとすると、次のエラーが発生します。

TypeError: Error #1034: Type Coercion failed: cannot convert "Testing Label" to views.TwoLabelCell.
    at PackTrack/initializeUI()[/Users/Nathan/Documents/Adobe Flash Builder 4.6/AIRTest/src/PackTrack.as:46]
    at PackTrack()[/Users/Nathan/Documents/Adobe Flash Builder 4.6/AIRTest/src/PackTrack.as:19]

これを解決する方法について何かアイデアはありますか?

PS:私はFlexを学んでいます(Javaから来ています)

4

1 に答える 1

4

質問に直接答えるには:でTwoLabelCellに文字列をキャストしようとしているため、クラスキャストエラーが発生しますpackList.cellRenderer = TwoLabelCell("Testing Label")newだから、あなたはキーワードを忘れたと思います。

私はあなたがJavaのバックグラウンドから来ていると言うことができます:そのコードは非常にSwingyに見えます;)
それで私はこれをFlexの方法で行う方法をあなたに示すと思いました。あなたが使用しているこれらのBlackberryクラスを知らないので、それを示すために、昔ながらのFlexに固執する必要があります。

バインド可能なプロパティを持つモデルクラスを作成します。

public class Pack {     
    [Bindable] public var label:String;
    [Bindable] public var description:String;       
}

次に、ItemRendererクラスを作成して、リスト内のデータをレンダリングします。これを呼び出しましょうPackRenderer.mxml

<s:ItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009" 
                xmlns:s="library://ns.adobe.com/flex/spark" 
                autoDrawBackground="true"
                height="50">

    <s:layout>
        <s:HorizontalLayout verticalAlign="middle" />
    </s:layout>

    <s:Label id="labelDisplay" />
    <s:Label text="{data.description}" color="0x777777" fontSize="17" />

</s:ItemRenderer>

使用したものと同じ効果を持つに設定heightしたことに注意してください。ItemRendererのプロパティは、それが表すPackモデルインスタンスです。 idを持つラベルは、Flexフレームワークによってそのプロパティに割り当てられたの値を自動的に取得します。他のラベルについては、データバインディング()を使用してモデルプロパティをラベルのプロパティにバインドします。50rowHeightdata
labelDisplaydata.labeltext{}descriptiontext

このitemrendererを使用してリストを作成します。

<fx:Script>
    <![CDATA[
        protected function handleItemSelected():void {
            trace("Item selected: " + list.selectedItem.label);
            trace("Index selected: " + list.selectedIndex);
        }
    ]]>
</fx:Script>

<fx:Declarations>
    <s:ArrayCollection id="dp">
        <so:Pack label="Item A" description="description A" />
        <so:Pack label="Item B" description="description B" />
        <so:Pack label="Item C" description="description C" />
    </s:ArrayCollection>
</fx:Declarations>

<s:List id="list" dataProvider="{dp}" width="310" height="400"
        itemRenderer="net.riastar.PackItemRenderer"
        change="handleItemSelected()" />

ここでデータをインラインで作成しましたが、もちろん、このArrayCollectionはサーバーから取得することもできます。
リストのレイアウトはデフォルトでVerticalLayoutなので、定義しません。
SparkリストにはitemClickイベントハンドラーがないためchange、リストで選択したインデックス/アイテムが変更されるたびに実行されるハンドラーを使用します。

于 2012-06-15T10:52:29.080 に答える