3

リストを表示したい (タイル レイアウトですが、何も変わらないと思います)、長押ししたタイルの編集ウィンドウを開きます (つまり、少なくとも 1 秒間押します)。タイマーは正常に開始され、1 秒後に longPressHandler イベントが正しく呼び出されますが、選択されたオブジェクトは、以前に触れたオブジェクトです。

たとえば、オブジェクト A をタップしてから、オブジェクト B を長押しすると、longPressHandler が編集ウィンドウでオブジェクト A を「開きます」。デバッグしたところ、List の SelectedItem プロパティは、長押しを終了した後にのみ更新されることがわかりました (指を離すか、マウス ボタンを離した後など)。現在選択されているアイテムを開く方法はありますか?


関連するアクション スクリプト:

private  var longPressTimer:Timer = new Timer(1000,1);

private function startLongPressMouse(event:MouseEvent):void {   
    startLongPressTimer();
    list.addEventListener(MouseEvent.MOUSE_MOVE, endLongPressMouse);
}
private function endLongPressMouse(event:MouseEvent):void {
    stopLongPressTimer();
    enableClick();
    list.removeEventListener(MouseEvent.MOUSE_MOVE, endLongPressMouse);
}
private function startLongPress(event:TouchEvent):void {
    startLongPressTimer();
    list.addEventListener(TouchEvent.TOUCH_MOVE, endLongPress);
}
private function endLongPress(event:TouchEvent):void {
    stopLongPressTimer();
    enableClick();
    list.removeEventListener(TouchEvent.TOUCH_MOVE, endLongPress);
}
private function startLongPressTimer():void {
    longPressTimer.start();
    longPressTimer.addEventListener(TimerEvent.TIMER_COMPLETE, longPressHandler);
}
protected function disableClick():void {
    trace("disable click");
    list.removeEventListener(MouseEvent.CLICK, regularClickHander);
}
public function enableClick():void {
    list.callLater(list.addEventListener, [MouseEvent.CLICK, regularClickHander]);
}
public function resetListSelection():void {
    list.selectedIndex = -1;
    list.validateDisplayList();
}
private function stopLongPressTimer():void{
    longPressTimer.stop();
    longPressTimer.reset()
}
public function longPressHandler(event:TimerEvent):void{
    disableClick();
    stopLongPressTimer();
    lblD.text = "Long Press Detected on: " + list.selectedItem.className;
}

関連する MXML:

 <s:List id="list"  dataProvider="{grades}" touchBegin="startLongPress(event)" touchEnd="endLongPress(event)"
        mouseDown="startLongPressMouse(event)" mouseUp="endLongPressMouse(event)"
        labelField="name"
        left.landscape="10" right.landscape="20" top.landscape="350" bottom.landscape="20"
        left.portrait="20" right.portrait="20" top.portrait="350" bottom.portrait="20">
    <s:itemRenderer>
        <fx:Component>
            <s:ItemRenderer width="100%" height="200">

                <s:Label text="{data.className}" top="30" horizontalCenter="0" color="#646464"/>
                <s:Label text="{data.credits}" top="50" horizontalCenter="0" color="#646464" fontSize="14"/>
                <s:Label text="{data.grade}" top="100" horizontalCenter="0" color="#646464" fontSize="14"/>
            </s:ItemRenderer>
        </fx:Component>
    </s:itemRenderer>
    <s:layout>
        <s:TileLayout requestedColumnCount="3" requestedColumnCount.landscape="4" columnAlign="justifyUsingWidth"/>
    </s:layout>
</s:List>

編集ウィンドウを開くのではなく、選択したアイテムの名前だけを表示するように longPressHandler を変更しました。

さらに情報が必要な場合はお知らせください。よろしくお願いします。

4

1 に答える 1

0

1 つの方法は、イベントをディスパッチするときに必要なデータを渡すことができるように、(カスタム プロパティを使用して) カスタム イベントを作成することです。

package events;
{
    import flash.events.Event;

    public class YourCustomEvent extends Event
    {
        public var yourData:Object;

        public function YourCustomEvent(type:String, yourData:Object)
        {
            super(type);
            this.yourData = yourData;
        }

        override public function clone():Event{
            return new YourCustomEvent(type, yourData);
        }
    }
}

それが役に立てば幸い!

PS:これをコメントに入れたかったのですが、入力すると大きくなりました:)

于 2013-02-08T00:41:14.473 に答える