2

我已经在 List 组件上设置了itemRollOveritemRollOut事件侦听器,但是每当我将鼠标滚动到列表项上时,同一个列表项的 over 和 out 事件都会依次触发。我的列表使用自定义 itemRenderer。

任何想法为什么会这样?Adobe 文档没有提供对此的深入了解(不足为奇......)。

4

6 回答 6

1

在我看来,这是一个错误。ListBase.mouseOverHandler 现在在调度 ITEM_ROLL_OVER 事件时设置一个名为 lastHighlightItemRendererAtIndices 的变量,然后在 ListBase.clearHighlight(由 mouseOutHandler 调用)中调度 ITEM_ROLL_OUT 事件时使用该变量(与 lastHighlightItemIndices 一起)。

问题是,当您逐行使用鼠标时,首先调用 mouseOverHandler,设置 lastHightlight... 变量,然后当随后调用 mouseOutHandler 时,它使用刚刚设置的 lastHighlight... 值结果是您会为同一渲染器获得连续的“翻转”和“推出”事件。

坦率地说,我不知道为什么 ListBase.clearHighlight 在调度 ITEM_ROLL_OUT 事件时不使用传入的渲染器(这是它在 SDK 2 中的工作方式),因为这是正在“推出”的实际渲染器.

于 2009-01-13T18:55:46.597 回答
0

它们来自同一个物体吗?如果不是,您很可能会从刚刚离开的“项目”中获得 itemRollOut,从您输入的新项目中获得 itemRollOver,这取决于它们的间距,因此它们可能彼此非常接近。

于 2008-12-01T15:35:01.787 回答
0

如果要覆盖 set data(),请确保在项目渲染器中设置super.data 。

ListBase 监听 MOUSE_OVER,然后根据鼠标的坐标和项目渲染器的位置找出它下面的项目。您可以检查 ListEvent.itemRenderer 以查看哪个渲染器的翻转和滚动正在触发以及以什么顺序触发。

最坏的情况是,您可以在项目渲染器中监听 rollOver 和 rollOut。

于 2009-01-13T07:42:08.390 回答
0

有同样的问题。super.data 已经被设置,并且该项目对于 rollOut 和 rollOver 事件是相同的。我最终选择了 anirudhsasikumar 的最坏情况,并在项目渲染器中监听了 rollOver 和 rollOut。似乎工作正常。

于 2009-05-04T22:20:19.117 回答
0

我遇到了同样的问题。我最终继承了 mx.controls.List 类并覆盖了 clearHighlight 函数。据我所知,lastHighlightItemIndices 变量只能在该函数中读取。因此,执行以下操作可以解决此问题:

import mx.core.mx_internal;

use namespace mx_internal;

public class List extends mx.controls.List
{
    public function List()
    {
        super();
    }

    override mx_internal function clearHighlight( item:IListItemRenderer ):void
    {
        var uid:String = itemToUID( item.data );

        drawItem( UIDToItemRenderer( uid ), isItemSelected( item.data ), false, uid == caretUID );

        var pt:Point = itemRendererToIndices( item );

        if( pt )
        {
            var listEvent:ListEvent = new ListEvent( ListEvent.ITEM_ROLL_OUT );

            listEvent.columnIndex = item.x;
            listEvent.rowIndex = item.y;
            listEvent.itemRenderer = item;

            dispatchEvent( listEvent );
        }
    }
}

然后只需使用这个 List 类而不是 Adob​​e 类,你就会得到你所期望的行为。我针对 Flex SDK 3.2 进行了测试,它可以工作。

<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml" xmlns:controls="com.example.controls.*">

    [ other code ... ]

    <controls:List itemRollOver="onItemRollOver( event )" itemRollOut="onItemRollOut( event )" />

</mx:Canvas>

感谢 Gino Basso 在上面的帖子中提出的想法。希望有帮助。

于 2009-07-24T18:56:58.770 回答
0

感谢您的解决方案。这真的解决了问题!不过,小修正:

listEvent.columnIndex = item.x;
listEvent.rowIndex = item.y;

应该

listEvent.columnIndex = pt.x;
listEvent.rowIndex = pt.y;

item.x and y hold the coordinate of the renderer in pixels.

于 2010-03-03T18:09:21.723 回答