List组件上的itemRollOver和itemRollOut事件的问题

时间:2008-12-01 15:03:11

标签: flex events flex3 adobe

我在List组件上设置了itemRollOveritemRollOut事件侦听器,但每当我将鼠标悬停在列表项上时,同一列表项的over和out事件都会连续触发紧接着。我的列表使用自定义itemRenderer。

为什么会出现这种情况? Adobe文档没有提供太多的信息(毫不奇怪......)。

6 个答案:

答案 0 :(得分: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中的工作方式)时不使用传入的渲染器,因为这是实际渲染的“滚动”超出'。

答案 1 :(得分:0)

他们来自同一个对象吗? 如果不是,你可能会从你刚刚离开的“item”获得一个itemRollOut,并从你输入的新项目获得一个itemRollOver,具体取决于它们的间距,这些可能会非常接近彼此。

答案 2 :(得分:0)

如果要覆盖设置数据(),请确保在项呈示器中设置 super.data

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

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

答案 3 :(得分:0)

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

答案 4 :(得分: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类而不是Adobe类,您将拥有所期望的行为。我针对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在上面的帖子中的想法。希望有所帮助。

答案 5 :(得分:0)

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

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

应该是

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

item.x和y保持渲染器的坐标(以像素为单位)。