itemRollOver
List コンポーネントにおよびイベント リスナーを設定しitemRollOut
ましたが、リスト アイテムの上にマウスを移動すると、同じリスト アイテムの over イベントと out イベントの両方が次々と発生します。私のリストはカスタム itemRenderer を使用しています。
なぜこれが考えられるのでしょうか?Adobe のドキュメントでは、これに関する詳細な情報は提供されていません (驚くべきことではありませんが...)。
itemRollOver
List コンポーネントにおよびイベント リスナーを設定しitemRollOut
ましたが、リスト アイテムの上にマウスを移動すると、同じリスト アイテムの over イベントと out イベントの両方が次々と発生します。私のリストはカスタム itemRenderer を使用しています。
なぜこれが考えられるのでしょうか?Adobe のドキュメントでは、これに関する詳細な情報は提供されていません (驚くべきことではありませんが...)。
In my opinion this is a bug. The ListBase.mouseOverHandler now sets a variable called lastHighlightItemRendererAtIndices when it dispatches an ITEM_ROLL_OVER event, which is then used (together with lastHighlightItemIndices) when dispatching an ITEM_ROLL_OUT event in ListBase.clearHighlight (called by the mouseOutHandler).
The problem is that when you mouse from row-to-row the mouseOverHandler is called first, setting the lastHightlight... variables, and then when the mouseOutHandler gets called subsequently, it uses the lastHighlight... values that were just set with the result that you get consecutive 'roll over' and 'roll out' events for the same renderer.
Frankly I don't know why ListBase.clearHighlight just doesn't use the passed in renderer when dispatching the ITEM_ROLL_OUT event (which is how it used to work in SDK 2) as this is the actual renderer that is being 'rolled out of'.
解決してくれてありがとう。それは本当に問題を解決しました!ただし、小さな修正:
listEvent.columnIndex = item.x;
listEvent.rowIndex = item.y;
する必要があります
listEvent.columnIndex = pt.x;
listEvent.rowIndex = pt.y;
item.xとyは、レンダラーの座標をピクセル単位で保持します。
それらは同じオブジェクトから来ていますか?そうでない場合は、間隔に応じて、残した「アイテム」からitemRollOutを取得し、入力した新しいアイテムからitemRollOverを取得する可能性があります。これらは互いに非常に接近して発生する可能性があります。
同じ問題がありました。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 );
}
}
}
次に、Adobe の代わりにこの List クラスを使用するだけで、期待どおりの動作が得られます。これを 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 に感謝します。それが役立つことを願っています。