我在List组件上设置了itemRollOver
和itemRollOut
事件侦听器,但每当我将鼠标悬停在列表项上时,同一列表项的over和out事件都会连续触发紧接着。我的列表使用自定义itemRenderer。
为什么会出现这种情况? Adobe文档没有提供太多的信息(毫不奇怪......)。
答案 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保持渲染器的坐标(以像素为单位)。