我已经在 List 组件上设置了itemRollOver
和itemRollOut
事件侦听器,但是每当我将鼠标滚动到列表项上时,同一个列表项的 over 和 out 事件都会依次触发。我的列表使用自定义 itemRenderer。
任何想法为什么会这样?Adobe 文档没有提供对此的深入了解(不足为奇......)。
我已经在 List 组件上设置了itemRollOver
和itemRollOut
事件侦听器,但是每当我将鼠标滚动到列表项上时,同一个列表项的 over 和 out 事件都会依次触发。我的列表使用自定义 itemRenderer。
任何想法为什么会这样?Adobe 文档没有提供对此的深入了解(不足为奇......)。
在我看来,这是一个错误。ListBase.mouseOverHandler 现在在调度 ITEM_ROLL_OVER 事件时设置一个名为 lastHighlightItemRendererAtIndices 的变量,然后在 ListBase.clearHighlight(由 mouseOutHandler 调用)中调度 ITEM_ROLL_OUT 事件时使用该变量(与 lastHighlightItemIndices 一起)。
问题是,当您逐行使用鼠标时,首先调用 mouseOverHandler,设置 lastHightlight... 变量,然后当随后调用 mouseOutHandler 时,它使用刚刚设置的 lastHighlight... 值结果是您会为同一渲染器获得连续的“翻转”和“推出”事件。
坦率地说,我不知道为什么 ListBase.clearHighlight 在调度 ITEM_ROLL_OUT 事件时不使用传入的渲染器(这是它在 SDK 2 中的工作方式),因为这是正在“推出”的实际渲染器.
它们来自同一个物体吗?如果不是,您很可能会从刚刚离开的“项目”中获得 itemRollOut,从您输入的新项目中获得 itemRollOver,这取决于它们的间距,因此它们可能彼此非常接近。
如果要覆盖 set data(),请确保在项目渲染器中设置super.data 。
ListBase 监听 MOUSE_OVER,然后根据鼠标的坐标和项目渲染器的位置找出它下面的项目。您可以检查 ListEvent.itemRenderer 以查看哪个渲染器的翻转和滚动正在触发以及以什么顺序触发。
最坏的情况是,您可以在项目渲染器中监听 rollOver 和 rollOut。
有同样的问题。super.data 已经被设置,并且该项目对于 rollOut 和 rollOver 事件是相同的。我最终选择了 anirudhsasikumar 的最坏情况,并在项目渲染器中监听了 rollOver 和 rollOut。似乎工作正常。
我遇到了同样的问题。我最终继承了 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 在上面的帖子中提出的想法。希望有帮助。
感谢您的解决方案。这真的解决了问题!不过,小修正:
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.